diff --git a/ietf/liaisons/admin.py b/ietf/liaisons/admin.py index bd43dc02e..ee83bd29c 100644 --- a/ietf/liaisons/admin.py +++ b/ietf/liaisons/admin.py @@ -20,11 +20,12 @@ class FromBodiesAdmin(admin.ModelAdmin): class LiaisonDetailAdmin(admin.ModelAdmin): + list_display = ['detail_id', 'title', 'legacy_from_body', 'to_body', 'submitted_date', 'purpose', 'related_to'] ordering = ('title', ) - fields = ('title', 'body','submitted_date', 'last_modified_date', 'to_email', 'cc1', 'cc2', 'to_poc', - 'response_contact', 'technical_contact', 'purpose', 'purpose_text', 'deadline_date', 'taken_care', - 'related_to') - raw_id_fields=['related_to'] +# fields = ('title', 'body','submitted_date', 'last_modified_date', 'to_email', 'cc1', 'cc2', 'to_poc', +# 'response_contact', 'technical_contact', 'purpose', 'purpose_text', 'deadline_date', 'action_taken', +# 'related_to') + raw_id_fields=['person', 'related_to'] class LiaisonPurposeAdmin(admin.ModelAdmin): ordering = ('purpose_text', ) @@ -41,16 +42,19 @@ class SDOAuthorizedIndividualInline(admin.TabularInline): class LiaisonManagersAdmin(admin.ModelAdmin): + list_display = ['id', '__unicode__', 'person_link', 'user_name', 'groups', 'sdo_link', ] ordering = ('person__first_name', 'person__last_name' ) - fields = ('person', 'sdo') +# fields = ('person', 'sdo') raw_id_fields=['person'] class SDOAuthorizedIndividualAdmin(admin.ModelAdmin): + list_display = ['id', 'person_link', 'user_name', 'groups', 'sdo_link'] raw_id_fields=['person'] class SDOsAdmin(admin.ModelAdmin): + list_display = ['sdo_id', 'sdo_name', 'liaisonmanager_link', 'sdo_contact_link'] inlines = [LiaisonManagersInline, SDOAuthorizedIndividualInline] def get_urls(self): diff --git a/ietf/liaisons/management/commands/check_liaison_deadlines.py b/ietf/liaisons/management/commands/check_liaison_deadlines.py index 0e1c759cc..ad68661cc 100644 --- a/ietf/liaisons/management/commands/check_liaison_deadlines.py +++ b/ietf/liaisons/management/commands/check_liaison_deadlines.py @@ -55,7 +55,7 @@ class Command(BaseCommand): def handle(self, *args, **options): today = datetime.date.today() - query = LiaisonDetail.objects.filter(deadline_date__isnull=False, taken_care=False, deadline_date__gte=today - datetime.timedelta(14)) + query = LiaisonDetail.objects.filter(deadline_date__isnull=False, action_taken=False, deadline_date__gte=today - datetime.timedelta(14)) for liaison in query: delta = liaison.deadline_date - today if delta.days < 0 or delta.days in PREVIOUS_DAYS.keys(): diff --git a/ietf/liaisons/models.py b/ietf/liaisons/models.py index 05cd13182..2b36ea54d 100644 --- a/ietf/liaisons/models.py +++ b/ietf/liaisons/models.py @@ -4,8 +4,11 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.db import models from django.template.loader import render_to_string -from ietf.idtracker.models import Acronym,PersonOrOrgInfo, Area +from django.contrib.auth.models import User +from ietf.idtracker.models import Acronym, PersonOrOrgInfo, Area, IESGLogin from ietf.liaisons.mail import IETFEmailMessage +from ietf.ietfauth.models import LegacyLiaisonUser +from ietf.utils.admin import admin_link class LiaisonPurpose(models.Model): purpose_id = models.AutoField(primary_key=True) @@ -62,7 +65,7 @@ class LiaisonDetail(models.Model): from_raw_body = models.CharField(blank=True, null=True, max_length=255) from_raw_code = models.CharField(blank=True, null=True, max_length=255) approval = models.ForeignKey(OutgoingLiaisonApproval, blank=True, null=True) - taken_care = models.BooleanField(default=False) + action_taken = models.BooleanField(default=False, db_column='taken_care') related_to = models.ForeignKey('LiaisonDetail', blank=True, null=True) def __str__(self): return self.title or "" @@ -76,7 +79,13 @@ class LiaisonDetail(models.Model): if not self.from_raw_body: return self.legacy_from_body() return self.from_raw_body - + def from_sdo(self): + try: + name = FromBodies.objects.get(pk=self.from_id).body_name + sdo = SDOs.objects.get(sdo_name=name) + return sdo + except ObjectDoesNotExist: + return None def legacy_from_body(self): """The from_id field is a foreign key for either FromBodies or Acronyms, depending on whether it's @@ -101,7 +110,7 @@ class LiaisonDetail(models.Model): return "IETF %s %s" % (acronym.acronym.upper(), kind) except ObjectDoesNotExist: pass - return "" % self.from_id + return "" % self.from_id def from_email(self): """If there is an entry in from_bodies, it has the desired email priority. However, if it's from @@ -170,8 +179,8 @@ class LiaisonDetail(models.Model): class SDOs(models.Model): - sdo_id = models.AutoField(primary_key=True) - sdo_name = models.CharField(blank=True, max_length=255) + sdo_id = models.AutoField(primary_key=True, verbose_name='ID') + sdo_name = models.CharField(blank=True, max_length=255, verbose_name='SDO Name') def __str__(self): return self.sdo_name def liaisonmanager(self): @@ -179,36 +188,76 @@ class SDOs(models.Model): return self.liaisonmanagers_set.all()[0] except: return None + def sdo_contact(self): + try: + return self.sdoauthorizedindividual_set.all()[0] + except: + return None class Meta: verbose_name = 'SDO' verbose_name_plural = 'SDOs' db_table = 'sdos' ordering = ('sdo_name', ) + liaisonmanager_link = admin_link('liaisonmanager', label='Liaison') + sdo_contact_link = admin_link('sdo_contact') -class LiaisonManagers(models.Model): +class LiaisonStatementManager(models.Model): person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag') + sdo = models.ForeignKey(SDOs, verbose_name='SDO') + def __unicode__(self): + return '%s (%s)' % (self.person, self.sdo) + class Meta: + abstract = True + # Helper functions, for use in the admin interface + def login_name(self): + login_name = None + try: + login_name = IESGLogin.objects.get(person=self.person).login_name + if User.objects.filter(username=login_name).count(): + return login_name + except IESGLogin.DoesNotExist: + pass + try: + login_name = LegacyLiaisonUser.objects.get(person=self.person).login_name + except LegacyLiaisonUser.DoesNotExist: + pass + return login_name + def user(self): + login_name = self.login_name() + user = None + if login_name: + try: + return User.objects.get(username=login_name), login_name + except User.DoesNotExist: + pass + return None, login_name + def user_name(self): + user, login_name = self.user() + if user: + return u'%s' % (user.id, login_name) + else: + return u'%s' % (login_name) + user_name.allow_tags = True + def groups(self): + user, login_name = self.user() + return ", ".join([ group.name for group in user.groups.all()]) + person_link = admin_link('person') + sdo_link = admin_link('sdo', label='SDO') + +class LiaisonManagers(LiaisonStatementManager): email_priority = models.IntegerField(null=True, blank=True) - sdo = models.ForeignKey(SDOs) def email(self): try: return self.person.emailaddress_set.get(priority=self.email_priority) except ObjectDoesNotExist: return None - def __unicode__(self): - return '%s (%s)' % (self.person, self.sdo) class Meta: verbose_name = 'SDO Liaison Manager' verbose_name_plural = 'SDO Liaison Managers' db_table = 'liaison_managers' ordering = ('sdo__sdo_name', ) -class SDOAuthorizedIndividual(models.Model): - person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag') - sdo = models.ForeignKey(SDOs) - - def __unicode__(self): - return '%s (%s)' % (self.person, self.sdo) - +class SDOAuthorizedIndividual(LiaisonStatementManager): class Meta: verbose_name = 'SDO Authorized Individual' verbose_name_plural = 'SDO Authorized Individuals' diff --git a/ietf/liaisons/views.py b/ietf/liaisons/views.py index fbbaaecd4..3481bb841 100644 --- a/ietf/liaisons/views.py +++ b/ietf/liaisons/views.py @@ -172,7 +172,7 @@ def liaison_approval_detail(request, object_id): def _can_take_care(liaison, user): - if not liaison.deadline_date or liaison.taken_care: + if not liaison.deadline_date or liaison.action_taken: return False if user.is_authenticated(): @@ -212,8 +212,8 @@ def liaison_detail(request, object_id): can_take_care = _can_take_care(liaison, user) if user.is_authenticated() and user.groups.filter(name__in=LIAISON_EDIT_GROUPS): can_edit = True - if request.method == 'POST' and request.POST.get('do_taken_care', None) and can_take_care: - liaison.taken_care = True + if request.method == 'POST' and request.POST.get('do_action_taken', None) and can_take_care: + liaison.action_taken = True liaison.save() can_take_care = False relations = liaison.liaisondetail_set.filter(qfilter) diff --git a/ietf/templates/liaisons/liaisondetail_detail.html b/ietf/templates/liaisons/liaisondetail_detail.html index 91e4d761c..612336274 100644 --- a/ietf/templates/liaisons/liaisondetail_detail.html +++ b/ietf/templates/liaisons/liaisondetail_detail.html @@ -15,7 +15,6 @@ {% block content %}

Liaison Statement: {% include 'liaisons/liaison_title.html' %}

- @@ -55,12 +54,12 @@ {% if can_take_care %} {% else %} {% endif %} diff --git a/static/css/liaisons.css b/static/css/liaisons.css index 3aa541d43..a3fda491d 100644 --- a/static/css/liaisons.css +++ b/static/css/liaisons.css @@ -120,14 +120,14 @@ th.orderFieldActive a { padding-left: 20px; } -.noTakedCare, -.takedCare { +.noActionTaken, +.actionTaken { border: 1px solid green; padding: 2px 5px; background-color: #ccffbb; } -.noTakedCare { +.noActionTaken { border: 1px solid red; background-color: #ffccbb; }
Submission Date:{{ object.submitted_date }}
{{ object.deadline_date }} -{% if object.taken_care %}Action Taken{% else %}Action Required{% endif %} - +{% if object.action_taken %}Action Taken{% else %}Action Required{% endif %} +
{{ object.deadline_date }} -{% if object.taken_care %}Action Taken{% else %}Action Needed{% endif %} +{% if object.action_taken %}Action Taken{% else %}Action Needed{% endif %}