Skip to content
Snippets Groups Projects
Commit 871eba73 authored by Nadja Geisler's avatar Nadja Geisler :sunny:
Browse files

Merge branch 'feature-recent' into 'master'

Add feed of recent changes to individual dashboard

Closes #72

See merge request kif/akplanning!56
parents ff61756d 7a3ebe79
No related branches found
No related tags found
1 merge request!56Add feed of recent changes to individual dashboard
Pipeline #8766 passed
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-19 20:46+0000\n"
"POT-Creation-Date: 2020-09-20 21:40+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -62,36 +62,61 @@ msgid "Event this button belongs to"
msgstr "Veranstaltung, zu der dieser Button gehört"
#: AKDashboard/templates/AKDashboard/dashboard.html:25
#: AKDashboard/templates/AKDashboard/dashboard_event.html:37
msgid "Write to organizers of this event for questions and comments"
msgstr ""
"Kontaktiere die Organisator*innen des Events bei Fragen oder Kommentaren"
#: AKDashboard/templates/AKDashboard/dashboard.html:32
msgid "Currently, there are no Events!"
msgstr "Aktuell gibt es keine Events!"
#: AKDashboard/templates/AKDashboard/dashboard.html:28
#: AKDashboard/templates/AKDashboard/dashboard.html:35
msgid "Please contact an administrator if you want to use AKPlanning."
msgstr ""
"Bitte kontaktiere eine*n Administrator*in, falls du AKPlanning verwenden "
"möchtest."
#: AKDashboard/templates/AKDashboard/dashboard_row.html:13
#: AKDashboard/templates/AKDashboard/dashboard_event.html:27
msgid "Recent"
msgstr "Kürzlich"
#: AKDashboard/templates/AKDashboard/dashboard_row.html:12
msgid "AK List"
msgstr "AK Liste"
#: AKDashboard/templates/AKDashboard/dashboard_row.html:24
#: AKDashboard/templates/AKDashboard/dashboard_row.html:23
msgid "Current AKs"
msgstr "Aktuelle AKs"
#: AKDashboard/templates/AKDashboard/dashboard_row.html:31
#: AKDashboard/templates/AKDashboard/dashboard_row.html:30
msgid "AK Wall"
msgstr "AK-Wall"
#: AKDashboard/templates/AKDashboard/dashboard_row.html:39
#: AKDashboard/templates/AKDashboard/dashboard_row.html:38
msgid "Schedule"
msgstr "AK-Plan"
#: AKDashboard/templates/AKDashboard/dashboard_row.html:50
#: AKDashboard/templates/AKDashboard/dashboard_row.html:49
msgid "AK Submission"
msgstr "AK-Submission"
#: AKDashboard/templates/AKDashboard/dashboard_row.html:66
msgid "Write to organizers of this event for questions and comments"
msgstr ""
"Kontaktiere die Organisator*innen des Events bei Fragen oder Kommentaren"
#: AKDashboard/views.py:42
#, python-format
msgid "New AK: %(ak)s."
msgstr "Neuer AK: %(ak)s."
#: AKDashboard/views.py:45
#, python-format
msgid "AK \"%(ak)s\" edited."
msgstr "AK \"%(ak)s\" bearbeitet."
#: AKDashboard/views.py:48
#, python-format
msgid "AK \"%(ak)s\" deleted."
msgstr "AK \"%(ak)s\" gelöscht."
#: AKDashboard/views.py:58
#, python-format
msgid "AK \"%(ak)s\" (re-)scheduled."
msgstr "AK \"%(ak)s\" (um-)geplant."
......@@ -29,3 +29,20 @@
display: inline;
padding: 0;
}
#recent-changes-list {
list-style-type:none;
padding-left: 0;
line-height: 220%;
}
#recent-changes-list li {
font-size: 120%;
font-family:monospace;
}
#recent-changes-list a {
text-decoration: none;
color: #555555;
font-weight: bold;
}
......@@ -18,7 +18,14 @@
{% block content %}
{% for event in events %}
{% include "AKDashboard/dashboard_row.html" %}
<div class="dashboard-row">
{% include "AKDashboard/dashboard_row.html" %}
{% if event.contact_email %}
<p>
<a href="mailto:{{ event.contact_email }}">{% fa5_icon "envelope" "fas" %} {% trans "Write to organizers of this event for questions and comments" %}</a>
</p>
{% endif %}
</div>
{% empty %}
<div class="jumbotron">
<h2 class="display-4">
......
......@@ -4,6 +4,7 @@
{% load i18n %}
{% load static %}
{% load tags_AKModel %}
{% load tz %}
{% block imports %}
......@@ -19,5 +20,22 @@
{% endblock %}
{% block content %}
{% include "AKDashboard/dashboard_row.html" %}
<div class="dashboard-row">
{% include "AKDashboard/dashboard_row.html" %}
{% if recent_changes|length > 0 %}
<h3 class="mt-1">{% trans "Recent" %}:</h3>
<ul id="recent-changes-list">
{% for recent in recent_changes %}
<li><a href="{{ recent.link }}">{% fa5_icon recent.icon.0 recent.icon.1 %} {{ recent.text }}</a> <span style="color: #999999;">{{ recent.timestamp | timezone:event.timezone | date:"d.m. H:i" }}</span></li>
{% endfor %}
</ul>
{% endif %}
{% if event.contact_email %}
<p>
<a href="mailto:{{ event.contact_email }}">{% fa5_icon "envelope" "fas" %} {% trans "Write to organizers of this event for questions and comments" %}</a>
</p>
{% endif %}
</div>
{% endblock %}
......@@ -2,68 +2,62 @@
{% load tags_AKModel %}
{% load fontawesome_5 %}
<div class="dashboard-row">
<h2> {{ event.name }} </h2>
<div class="row">
{% if 'AKSubmission'|check_app_installed %}
<a class="dashboard-box btn btn-primary"
href="{% url 'submit:ak_list' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-list-ul"></span>
<span class='text'>{% trans 'AK List' %}</span>
</div>
</a>
{% endif %}
{% if 'AKPlan'|check_app_installed %}
{% if not event.plan_hidden or user.is_staff %}
{% if event.active %}
<a class="dashboard-box btn btn-primary"
href="{% url 'plan:plan_overview' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-clock"></span>
<span class='text'>{% trans 'Current AKs' %}</span>
</div>
</a>
<a class="dashboard-box btn btn-primary"
href="{% url 'plan:plan_wall' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-calendar"></span>
<span class='text'>{% trans 'AK Wall' %}</span>
</div>
</a>
{% else %}
<a class="dashboard-box btn btn-primary"
href="{% url 'plan:plan_overview' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-calendar-alt"></span>
<span class='text'>{% trans 'Schedule' %}</span>
</div>
</a>
{% endif %}
<h2><a href="{% url 'dashboard:dashboard_event' slug=event.slug %}">{{ event.name }}</a></h2>
<div class="row">
{% if 'AKSubmission'|check_app_installed %}
<a class="dashboard-box btn btn-primary"
href="{% url 'submit:ak_list' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-list-ul"></span>
<span class='text'>{% trans 'AK List' %}</span>
</div>
</a>
{% endif %}
{% if 'AKPlan'|check_app_installed %}
{% if not event.plan_hidden or user.is_staff %}
{% if event.active %}
<a class="dashboard-box btn btn-primary"
href="{% url 'plan:plan_overview' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-clock"></span>
<span class='text'>{% trans 'Current AKs' %}</span>
</div>
</a>
<a class="dashboard-box btn btn-primary"
href="{% url 'plan:plan_wall' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-calendar"></span>
<span class='text'>{% trans 'AK Wall' %}</span>
</div>
</a>
{% else %}
<a class="dashboard-box btn btn-primary"
href="{% url 'plan:plan_overview' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-calendar-alt"></span>
<span class='text'>{% trans 'Schedule' %}</span>
</div>
</a>
{% endif %}
{% endif %}
{% if 'AKSubmission'|check_app_installed and event.active %}
<a class="dashboard-box btn btn-primary"
href="{% url 'submit:submission_overview' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-pencil-alt"></span>
<span class='text'>{% trans 'AK Submission' %}</span>
</div>
</a>
{% endif %}
{% for button in event.dashboardbutton_set.all %}
<a class="dashboard-box btn btn-{{ button.get_color_display }}"
href="{{ button.url }}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
{% if button.icon %}<span class="fa">{{ button.icon.as_html }}</span>{% endif %}
<span class='text'>{{ button.text }}</span>
</div>
</a>
{% endfor %}
</div>
{% if event.contact_email %}
<p>
<a href="mailto:{{ event.contact_email }}">{% fa5_icon "envelope" "fas" %} {% trans "Write to organizers of this event for questions and comments" %}</a>
</p>
{% endif %}
{% if 'AKSubmission'|check_app_installed and event.active %}
<a class="dashboard-box btn btn-primary"
href="{% url 'submit:submission_overview' event_slug=event.slug %}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
<span class="fa fa-pencil-alt"></span>
<span class='text'>{% trans 'AK Submission' %}</span>
</div>
</a>
{% endif %}
{% for button in event.dashboardbutton_set.all %}
<a class="dashboard-box btn btn-{{ button.get_color_display }}"
href="{{ button.url }}">
<div class="col-sm-12 col-md-3 col-lg-2 dashboard-button">
{% if button.icon %}<span class="fa">{{ button.icon.as_html }}</span>{% endif %}
<span class='text'>{{ button.text }}</span>
</div>
</a>
{% endfor %}
</div>
from django.apps import apps
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.generic import TemplateView, DetailView
from django.utils.translation import gettext_lazy as _
from AKModel.models import Event
from AKModel.models import Event, AK, AKSlot
from AKPlanning import settings
class DashboardView(TemplateView):
......@@ -22,3 +26,43 @@ class DashboardEventView(DetailView):
template_name = 'AKDashboard/dashboard_event.html'
context_object_name = 'event'
model = Event
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Show feed of recent changes (if activated)
if settings.DASHBOARD_SHOW_RECENT:
recent_changes = []
# Newest AKs
if apps.is_installed("AKSubmission"):
submission_changes = AK.history.filter(event=context['event'])[:50]
for s in submission_changes:
if s.history_type == '+':
text = _('New AK: %(ak)s.') % {'ak': s.name}
icon = ('plus-square', 'far')
elif s.history_type == '~':
text = _('AK "%(ak)s" edited.') % {'ak': s.name}
icon = ('pen-square', 'fas')
else:
text = _('AK "%(ak)s" deleted.') % {'ak': s.name}
icon = ('times', 'fas')
recent_changes.append({'icon': icon, 'text': text, 'link': reverse_lazy('submit:ak_detail', kwargs={'event_slug': context['event'].slug, 'pk': s.id}), 'timestamp': s.history_date})
# Changes in plan
if apps.is_installed("AKPlan"):
if not context['event'].plan_hidden:
last_changed_slots = AKSlot.objects.filter(event=context['event']).order_by('-updated')[:50]
for changed_slot in last_changed_slots:
recent_changes.append({'icon': ('clock', 'far'), 'text': _('AK "%(ak)s" (re-)scheduled.') % {'ak': changed_slot.ak.name}, 'link': reverse_lazy('submit:ak_detail', kwargs={
'event_slug': context['event'].slug, 'pk': changed_slot.ak.id}), 'timestamp': changed_slot.updated})
# Sort by change date...
recent_changes.sort(key=lambda x: x['timestamp'], reverse=True)
# ... and restrict to the latest 25 changes
context['recent_changes'] = recent_changes[:settings.DASHBOARD_RECENT_MAX]
else:
context['recent_changes'] = []
return context
......@@ -171,6 +171,11 @@ PLAN_SHOW_HIERARCHY = True
# For which time (in seconds) should changes of akslots be highlighted in plan?
PLAN_MAX_HIGHLIGHT_UPDATE_SECONDS = 2 * 60 * 60
# Show feed of recent changes in dashboard
DASHBOARD_SHOW_RECENT = True
# How many entries max?
DASHBOARD_RECENT_MAX = 25
# Registration/login behavior
SIMPLE_BACKEND_REDIRECT_URL = "/user/"
LOGIN_REDIRECT_URL = SIMPLE_BACKEND_REDIRECT_URL
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment