From 45f2c89cc92bfbf6af73ac2f32791f3b20ae801e Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 25 Jul 2011 09:42:39 +0200 Subject: Complete the general panel for dashboard (closes #520) --- ishtar/ishtar_base/models.py | 38 +++++++++++++++++++++++++++++++++++- ishtar/ishtar_base/views.py | 4 ++-- ishtar/templates/dashboard_main.html | 35 +++++++++++++++++++++++++++++++++ static/media/style.css | 6 ++++-- 4 files changed, 78 insertions(+), 5 deletions(-) diff --git a/ishtar/ishtar_base/models.py b/ishtar/ishtar_base/models.py index cbf362b83..89cb8e605 100644 --- a/ishtar/ishtar_base/models.py +++ b/ishtar/ishtar_base/models.py @@ -25,8 +25,9 @@ import datetime from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.core.validators import validate_slug from django.utils.translation import ugettext_lazy as _, ugettext -from django.db.utils import DatabaseError from django.utils.safestring import SafeUnicode, mark_safe +from django.core.urlresolvers import reverse, NoReverseMatch +from django.db.utils import DatabaseError from django.db.models import Q, Max, Count from django.db.models.signals import m2m_changed @@ -339,6 +340,13 @@ class BaseHistorizedItem(models.Model): values[k] = getattr(self, k) return values + def get_show_url(self): + try: + return reverse('show-'+self.__class__.__name__.lower(), + args=[self.pk, '']) + except NoReverseMatch: + return + class LightHistorizedItem(BaseHistorizedItem): history_date = models.DateTimeField(default=datetime.datetime.now) class Meta: @@ -348,10 +356,38 @@ class LightHistorizedItem(BaseHistorizedItem): super(LightHistorizedItem, self).save(*args, **kwargs) return True +class UserDashboard: + def __init__(self): + types = IshtarUser.objects.values('person__person_type', + 'person__person_type__label') + self.types = types.annotate(number=Count('pk')).order_by( + 'person__person_type') + class Dashboard: def __init__(self, model): self.model = model self.total_number = model.get_total_number() + history_model = self.model.history.model + # last edited - created + self.recents, self.lasts = [], [] + for last_lst, modif_type in ((self.lasts, '+'), (self.recents, '~')): + last_ids = history_model.objects.values('id').annotate(hd=\ + Max('history_date')) + last_ids = last_ids.filter(history_type=modif_type) + if self.model == Item: + last_ids = last_ids.filter(downstream_treatment_id__isnull=True) + if modif_type == '+': + last_ids = last_ids.filter(upstream_treatment_id__isnull=True) + last_ids = last_ids.order_by('-hd').distinct().all()[:5] + for idx in last_ids: + try: + obj = self.model.objects.get(pk=idx['id']) + except: + # deleted object are always referenced in history + continue + obj.history_date = idx['hd'] + print unicode(obj), obj.pk + last_lst.append(obj) # years self.years = model.get_years() self.years.sort() diff --git a/ishtar/ishtar_base/views.py b/ishtar/ishtar_base/views.py index ff55169c5..6527dec3a 100644 --- a/ishtar/ishtar_base/views.py +++ b/ishtar/ishtar_base/views.py @@ -243,7 +243,6 @@ def get_item(model, func_name, default_name, extra_request_keys=[], table_cols = full and [field.name for field in model._meta.fields if field.name not in PRIVATE_FIELDS] \ or model.TABLE_COLS - print table_cols for item in items: data = [item.pk] for k in table_cols: @@ -658,7 +657,8 @@ def dashboard_main(request, dct, obj_id=None, *args, **kwargs): (_(u"Operations"), models.Dashboard(models.Operation)), (_(u"Context records"), models.Dashboard(models.ContextRecord)), (_(u"Archaeological items"), models.Dashboard(models.Item)), - ]} + ], + 'ishtar_users':models.UserDashboard()} return render_to_response('dashboard_main.html', dct, context_instance=RequestContext(request)) diff --git a/ishtar/templates/dashboard_main.html b/ishtar/templates/dashboard_main.html index ae243f7c2..e710dbe16 100644 --- a/ishtar/templates/dashboard_main.html +++ b/ishtar/templates/dashboard_main.html @@ -41,7 +41,42 @@
  • {% trans "Mode:" %} {{dashboard.operation_mode}}
  • {% endif %} +

    {% trans "Created last" %}

    +
    + + + {% for item in dashboard.lasts %} + + + + {% endfor %} +
    {{lbl}}{% trans "Created" %}
    {{item}}{{item.history_date}}{% if item.get_show_url %}{%trans "Show"%}{%endif%}
    +
    +

    {% trans "Recent changes" %}

    +
    + + + {% for item in dashboard.recents %} + + + + {% endfor %} +
    {{lbl}}{% trans "Modified" %}
    {{item}}{{item.history_date}}{% if item.get_show_url %}{%trans "Show"%}{%endif%}
    +
    {% endfor%} +
    +

    {% trans "Users" %}

    +
    + + + {% for user_type in ishtar_users.types %} + + + + + {% endfor%} +
    {% trans "User type" %}{% trans "Number" %}
    {{user_type.person__person_type__label}}{{user_type.number}}
    +
    {% endblock %} diff --git a/static/media/style.css b/static/media/style.css index a6cd7487e..676867ff8 100644 --- a/static/media/style.css +++ b/static/media/style.css @@ -384,13 +384,15 @@ table.confirm tr.spacer td:last-child{ border:1px solid #EEE; } -#window table td.string{ +#window table td.string, .dashboard table td.string{ text-align:left; } -#window table td.ref{ +#window table td.ref, .dashboard table td.ref{ text-align:left; white-space:nowrap; + font-family:monospace; + font-size:9pt; } #window table td.no_items{ -- cgit v1.2.3