Пример #1
0
 def __init__(self, *args, **kwargs):
     self.list_display = list(self.list_display) + [
             u'assigned_to_column',
             u'action_column',
             ]
     self.list_filter = list(self.list_filter) + [
             simple_list_filter_factory(u'Assigned', u'assigned', [
                 (u'1', u'Yes', lambda qs: qs.filter(inforequest__isnull=False).distinct()),
                 (u'0', u'No',  lambda qs: qs.filter(inforequest__isnull=True)),
                 ]),
             simple_list_filter_factory(u'Action', u'action', [
                 (u'1', u'Yes', lambda qs: qs.filter(action__isnull=False).distinct()),
                 (u'0', u'No',  lambda qs: qs.filter(action__isnull=True)),
                 ]),
             ]
     self.search_fields = list(self.search_fields) + [
             u'=inforequest__pk',
             u'=action__pk',
             ]
     self.fieldsets[0][1][u'fields'] = list(self.fieldsets[0][1][u'fields']) + [
             u'assigned_to_field',
             u'action_field',
             ]
     self.readonly_fields = list(self.readonly_fields) + [
             u'assigned_to_field',
             u'action_field',
             ]
     super(MessageAdminMixin, self).__init__(*args, **kwargs)
Пример #2
0
class ObligeeAdmin(SimpleHistoryAdmin):
    list_display = [
            u'obligee_column',
            u'name',
            u'emails',
            u'status',
            u'branch_count_column',
            ]
    list_filter = [
            simple_list_filter_factory(u'Branches', u'branches', [
                (u'1', u'With', lambda qs: qs.filter(branch__count__gt=0)),
                (u'0', u'Without', lambda qs: qs.filter(branch__count=0)),
                ]),
            u'status',
            ]
    search_fields = [
            u'=id',
            u'name',
            u'emails',
            ]
    ordering = [u'name', u'pk']

    @decorate(short_description=u'Obligee')
    @decorate(admin_order_field=u'pk')
    def obligee_column(self, obligee):
        return admin_obj_format(obligee, link=False)

    @decorate(short_description=u'Branches')
    @decorate(admin_order_field=u'branch__count')
    def branch_count_column(self, obligee):
        return obligee.branch__count

    fields = [
            u'name',
            u'street',
            u'city',
            u'zip',
            u'emails',
            u'status',
            ]
    inlines = [
            ObligeeAdminBranchInline,
            ]

    def formfield_for_dbfield(self, db_field, **kwargs):
        field = super(ObligeeAdmin, self).formfield_for_dbfield(db_field, **kwargs)
        # Use textarea for emails
        if db_field.name == u'emails':
            field.widget = admin.widgets.AdminTextareaWidget()
        return field

    def has_delete_permission(self, request, obj=None):
        if obj is None:
            return True
        return not obj.branch_set.exists()

    def get_queryset(self, request):
        queryset = super(ObligeeAdmin, self).get_queryset(request)
        queryset = queryset.annotate(Count(u'branch'))
        return queryset
Пример #3
0
class InvitationAdmin(admin.ModelAdmin):
    date_hierarchy = u'created'
    list_display = [
        u'id',
        u'email',
        u'created',
        decorate(
            lambda o: u'Accepted' if o.is_accepted else u'Expired'
            if o.is_expired else u'Pending' if o.is_pending else u'--',
            short_description=u'State',
        ),
        decorate(
            lambda o: admin_obj_format(
                o.invitor, u'{obj.first_name} {obj.last_name} <{obj.email}>'),
            short_description=u'Invitor',
            admin_order_field=u'invitor__email',
        ),
        decorate(
            lambda o: admin_obj_format(
                o.invitee, u'{obj.first_name} {obj.last_name} <{obj.email}>'),
            short_description=u'Invitee',
            admin_order_field=u'invitee__email',
        ),
    ]
    list_filter = [
        u'created',
        simple_list_filter_factory(u'State', u'state', [
            (u'1', u'Accepted', lambda qs: qs.accepted()),
            (u'2', u'Expired', lambda qs: qs.expired()),
            (u'3', u'Pending', lambda qs: qs.pending()),
        ]),
    ]
    search_fields = [
        u'=id',
        u'email',
        u'invitor__first_name',
        u'invitor__last_name',
        u'invitor__email',
        u'invitee__first_name',
        u'invitee__last_name',
        u'invitee__email',
    ]
    ordering = [
        u'-created',
        u'-id',
    ]
    exclude = []
    readonly_fields = []
    raw_id_fields = [
        u'invitor',
        u'invitee',
        u'message',
    ]
    inlines = []

    def get_queryset(self, request):
        queryset = super(InvitationAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'invitor')
        queryset = queryset.select_related(u'invitee')
        return queryset
Пример #4
0
class MessageAdmin(admin.ModelAdmin):
    date_hierarchy = u'created'
    list_display = [
            u'id',
            u'type',
            decorate(
                lambda o: o.from_formatted,
                short_description=u'From',
                admin_order_field=u'from_mail',
                ),
            decorate(
                lambda o: u'; '.join(u'{}: {}'.format(k, v) for k, v in [
                    (u'To', o.to_formatted),
                    (u'Cc', o.cc_formatted),
                    (u'Bcc', o.bcc_formatted),
                    ] if v),
                short_description=u'Recipients',
                ),
            u'created',
            u'processed',
            ]
    list_filter = [
            u'type',
            u'created',
            simple_list_filter_factory(u'Processed', u'processed', [
                (u'1', u'Yes', lambda qs: qs.processed()),
                (u'0', u'No',  lambda qs: qs.not_processed()),
                ]),
            ]
    search_fields = [
            u'=id',
            u'from_name',
            u'from_mail',
            u'recipient__name',
            u'recipient__mail',
            u'received_for',
            ]
    ordering = [
            u'-created',
            u'-id',
            ]
    exclude = [
            ]
    readonly_fields = [
            ]
    raw_id_fields = [
            ]
    inlines = [
            RecipientInline,
            ]

    def get_queryset(self, request):
        queryset = super(MessageAdmin, self).get_queryset(request)
        queryset = queryset.prefetch_related(Message.prefetch_recipients())
        return queryset
Пример #5
0
class BranchAdmin(admin.ModelAdmin):
    date_hierarchy = None
    list_display = [
        u'id',
        decorate(
            lambda o: admin_obj_format(o.inforequest),
            short_description=u'Inforequest',
            admin_order_field=u'inforequest',
        ),
        decorate(
            lambda o: admin_obj_format(o.obligee, u'{obj.name}'),
            short_description=u'Obligee',
            admin_order_field=u'obligee',
        ),
        decorate(
            lambda o: admin_obj_format(o.advanced_by),
            short_description=u'Advanced by',
            admin_order_field=u'advanced_by',
        ),
    ]
    list_filter = [
        simple_list_filter_factory(u'Advanced', u'advanced', [
            (u'1', u'Yes', lambda qs: qs.advanced()),
            (u'2', u'No', lambda qs: qs.main()),
        ]),
    ]
    search_fields = [
        u'=id',
        u'=inforequest__id',
        u'obligee__name',
        u'=advanced_by__id',
    ]
    ordering = [
        u'id',
    ]
    exclude = []
    readonly_fields = []
    raw_id_fields = [
        u'inforequest',
        u'obligee',
        u'historicalobligee',
        u'advanced_by',
    ]
    inlines = []

    def get_queryset(self, request):
        queryset = super(BranchAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'inforequest')
        queryset = queryset.select_related(u'obligee')
        queryset = queryset.select_related(u'advanced_by')
        return queryset
Пример #6
0
class ProfileAdmin(admin.ModelAdmin):
    date_hierarchy = None
    list_display = [
        u'id',
        decorate(
            lambda o: admin_obj_format(
                o.user, u'{obj.first_name} {obj.last_name} <{obj.email}>'),
            short_description=u'User',
            admin_order_field=u'user__email',
        ),
        u'street',
        u'city',
        u'zip',
        decorate(
            lambda o: o.undecided_emails_count,
            short_description=u'Undecided E-mails',
            admin_order_field=u'undecided_emails_count',
        ),
    ]
    list_filter = [
        simple_list_filter_factory(u'Undecided E-mail', u'undecided', [
            (u'1', u'With',
             lambda qs: qs.filter(undecided_emails_count__gt=0)),
            (u'0', u'Without', lambda qs: qs.filter(undecided_emails_count=0)),
        ]),
    ]
    search_fields = [
        u'=id',
        u'user__first_name',
        u'user__last_name',
        u'user__email',
        u'street',
        u'city',
        u'zip',
    ]
    ordering = [
        u'id',
    ]
    exclude = []
    readonly_fields = []
    raw_id_fields = [
        u'user',
    ]
    inlines = []

    def get_queryset(self, request):
        queryset = super(ProfileAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'user')
        queryset = queryset.select_undecided_emails_count()
        return queryset
Пример #7
0
 def __init__(self, *args, **kwargs):
     self.list_display = list(self.list_display) + [
             u'inforequest_count_column',
             ]
     self.list_filter = list(self.list_filter) + [
         simple_list_filter_factory(u'Inforequests', u'inforequests', [
             (u'1', u'With', lambda qs: qs.filter(inforequest__count__gt=0)),
             (u'0', u'Without', lambda qs: qs.filter(inforequest__count=0)),
             ]),
             ]
     self.inlines = list(self.inlines) + [
             UserAdminMixinInforequestInline,
             UserAdminMixinInforequestDraftInline,
             ]
     super(UserAdminMixin, self).__init__(*args, **kwargs)
Пример #8
0
class InvitationAdmin(AdminLiveFieldsMixin, admin.ModelAdmin):
    list_display = [
            u'invitation_column',
            u'email',
            u'accepted_column',
            u'created',
            u'invitor_column',
            u'invitee_column',
            ]
    list_filter = [
            u'created',
            simple_list_filter_factory(u'Status', u'status', [
                (u'2', u'Expired', lambda qs: qs.expired()),
                (u'1', u'Accepted',  lambda qs: qs.accepted()),
                (u'0', u'Pending',  lambda qs: qs.pending()),
                ]),
            ]
    search_fields = [
            u'=id',
            u'email',
            u'invitor__first_name',
            u'invitor__last_name',
            u'invitor__email',
            u'invitee__first_name',
            u'invitee__last_name',
            u'invitee__email',
            ]
    ordering = [u'-created', u'-pk']

    @decorate(short_description=u'Invitation')
    @decorate(admin_order_field=u'pk')
    def invitation_column(self, invitation):
        return admin_obj_format(invitation, link=False)

    @decorate(short_description=u'Accepted')
    @decorate(boolean=True)
    def accepted_column(self, invitation):
        if invitation.is_accepted:
            return True
        elif invitation.is_expired:
            return False
        else:
            return None

    @decorate(short_description=u'Invitor')
    @decorate(admin_order_field=u'invitor__email')
    def invitor_column(self, invitation):
        user = invitation.invitor
        return admin_obj_format(user, u'{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'Invitee')
    @decorate(admin_order_field=u'invitee__email')
    def invitee_column(self, invitation):
        user = invitation.invitee
        return admin_obj_format(user, u'{obj.first_name} {obj.last_name} <{obj.email}>')

    form_add = InvitationAdminAddForm
    form_change = forms.ModelForm
    fieldsets = [
            (None, {
                u'classes': [u'wide'],
                u'fields': [
                    u'email',
                    u'accepted_column',
                    u'accept_url',
                    u'invitor',
                    u'invitor_details_live',
                    u'invitee',
                    u'invitee_details_live',
                    ],
                }),
            (u'Advanced', {
                u'classes': [u'wide', u'collapse'],
                u'fields': [
                    u'created',
                    u'valid_to',
                    u'accepted',
                    u'message',
                    u'message_details_live',
                    ],
                }),
            ]
    fieldsets_add = [
            (None, {
                u'fields': [
                    u'email',
                    u'validity',
                    u'invitor',
                    u'invitor_details_live',
                    u'send_email',
                    ],
                }),
            ]
    fieldsets_bulk_add = [
            (None, {
                u'fields': [
                    u'emails',
                    u'validity',
                    u'invitor',
                    u'invitor_details_live',
                    u'send_email',
                    ],
                }),
            ]
    live_fields = [
            u'invitor_details_live',
            u'invitee_details_live',
            u'message_details_live',
            ]
    readonly_fields = live_fields + [
            u'accepted_column',
            u'accept_url',
            ]
    raw_id_fields = [
            u'invitor',
            u'invitee',
            u'message',
            ]

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'invitor')
    def invitor_details_live(self, invitor):
        user = invitor
        return admin_obj_format(user, u'{tag}\n{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'invitee')
    def invitee_details_live(self, invitee):
        user = invitee
        return admin_obj_format(user, u'{tag}\n{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'message')
    def message_details_live(self, message):
        return admin_obj_format(message)

    def get_queryset(self, request):
        queryset = super(InvitationAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'invitor', u'invitee')
        return queryset

    @transaction.atomic
    def bulk_add_view(self, request):
        invitations = None
        if request.method == u'POST':
            form = InvitationAdminBulkAddForm(request.POST, user=request.user)
            if form.is_valid():
                invitations = form.save()
        else:
            form = InvitationAdminBulkAddForm(user=request.user)

        opts = self.model._meta
        template = u'admin/%s/%s/bulk_add_form.html' % (opts.app_label, opts.model_name)
        adminForm = admin.helpers.AdminForm(form,
                fieldsets=self.fieldsets_bulk_add,
                prepopulated_fields={},
                readonly_fields=self.readonly_fields,
                model_admin=self,
                )

        return render(request, template, {
            u'invitations': invitations,
            u'object': None,
            u'title': 'Bulk add %s' % force_text(opts.verbose_name),
            u'opts': opts,
            u'adminform': adminForm,
            u'media': self.media + adminForm.media,
            })

    def get_urls(self):
        info = self.model._meta.app_label, self.model._meta.model_name
        urls = patterns('',
                url(r'^bulk-add/$', self.admin_site.admin_view(self.bulk_add_view), name=u'%s_%s_bulk_add' % info),
                )
        return urls + super(InvitationAdmin, self).get_urls()

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            return self.fieldsets_add
        return super(InvitationAdmin, self).get_fieldsets(request, obj)

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            self.form = self.form_add
            form = super(InvitationAdmin, self).get_form(request, obj, **kwargs)
            form = partial(form, user=request.user)
        else:
            self.form = self.form_change
            form = super(InvitationAdmin, self).get_form(request, obj, **kwargs)
        return form

    def get_formsets(self, request, obj=None):
        if obj is None:
            return []
        return super(InvitationAdmin, self).get_formsets(request, obj)
Пример #9
0
class MessageAdmin(admin.ModelAdmin):
    list_display = [
        u'message_column',
        u'type',
        u'from_formatted_column',
        u'recipients_formatted_column',
        u'processed',
    ]
    list_filter = [
        u'type',
        simple_list_filter_factory(u'Processed', u'processed', [
            (u'1', u'Yes', lambda qs: qs.processed()),
            (u'0', u'No', lambda qs: qs.not_processed()),
        ]),
        u'processed',
    ]
    search_fields = [
        u'=id',
        u'from_name',
        u'from_mail',
        u'recipient__name',
        u'recipient__mail',
        u'received_for',
    ]
    ordering = [u'-processed', u'-pk']

    @decorate(short_description=u'Message')
    @decorate(admin_order_field=u'pk')
    def message_column(self, message):
        return admin_obj_format(message, link=False)

    @decorate(short_description=u'From')
    @decorate(admin_order_field=u'from_mail')
    def from_formatted_column(self, message):
        return message.from_formatted

    @decorate(short_description=u'Recipients')
    def recipients_formatted_column(self, message):
        res = []
        for label, formatted in [
            (u'To', message.to_formatted),
            (u'Cc', message.cc_formatted),
            (u'Bcc', message.bcc_formatted),
        ]:
            if formatted:
                res.append(u'%s: %s' % (label, formatted))
        return u'; '.join(res)

    form_add = MessageAdminAddForm
    form_change = forms.ModelForm
    fieldsets = (
        (None, {
            u'fields': [
                u'type',
                u'processed',
                u'from_name',
                u'from_mail',
                u'received_for',
                u'subject',
                (u'text', u'html'),
            ],
        }),
        (u'Advanced', {
            u'classes': [u'collapse'],
            u'fields': [
                u'headers',
            ],
        }),
    )
    fieldsets_add = (
        (None, {
            u'fields': [
                u'type',
                u'processed',
                u'from_formatted',
                u'to_formatted',
                u'cc_formatted',
                u'bcc_formatted',
                u'received_for',
                u'subject',
                (u'text', u'html'),
                u'attachments',
            ],
        }),
        (u'Advanced', {
            u'classes': [u'collapse'],
            u'fields': [
                u'headers',
            ],
        }),
    )
    inlines = [
        RecipientInline,
        AttachmentInline,
    ]

    def render_change_form(self, request, context, **kwargs):
        message = kwargs.get(u'obj', None)

        # Reply button
        if message and message.processed:
            query = {}
            query[
                u'type'] = Message.TYPES.INBOUND if message.type == Message.TYPES.OUTBOUND else Message.TYPES.OUTBOUND
            query[u'to_formatted'] = message.from_formatted
            query[u'subject'] = u'%s%s' % (u'' if message.subject.startswith(
                u'Re:') else u'Re: ', message.subject)

            if message.received_for:
                query[u'from_formatted'] = message.received_for
            elif message.recipients_to:
                query[u'from_formatted'] = message.recipients_to[0].formatted
            elif message.recipients:
                query[u'from_formatted'] = message.recipients[0].formatted

            date = formats.date_format(message.processed, u'DATETIME_FORMAT')
            name = message.from_name or message.from_mail
            quote = u'On {date}, {name} wrote:'.format(date=date, name=name)
            query[u'text'] = u'\n\n%s\n%s\n' % (quote, u'\n'.join(
                u'> %s' % l for l in message.text.split(u'\n')))
            query[u'html'] = u'\n\n%s\n%s\n' % (quote, u'\n'.join(
                u'> %s' % l for l in message.html.split(u'\n')))

            context[u'reply_url'] = u'%s?%s' % (
                reverse(u'admin:mail_message_add'), urlencode(query))

        return super(MessageAdmin,
                     self).render_change_form(request, context, **kwargs)

    def get_queryset(self, request):
        queryset = super(MessageAdmin, self).get_queryset(request)
        queryset = queryset.prefetch_related(Message.prefetch_recipients())
        return queryset

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            return self.fieldsets_add
        return super(MessageAdmin, self).get_fieldsets(request, obj)

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            self.form = self.form_add
            form = super(MessageAdmin, self).get_form(request, obj, **kwargs)
            session = Session.objects.get(
                session_key=request.session.session_key)
            form = partial(form, attached_to=session)
        else:
            self.form = self.form_change
            form = super(MessageAdmin, self).get_form(request, obj, **kwargs)
        return form

    def get_formsets(self, request, obj=None):
        if obj is None:
            return []
        return super(MessageAdmin, self).get_formsets(request, obj)
Пример #10
0
class InforequestAdmin(admin.ModelAdmin):
    date_hierarchy = u'submission_date'
    list_display = [
        u'id',
        decorate(
            lambda o: admin_obj_format(
                o.applicant, u'{obj.first_name} {obj.last_name} <{obj.email}>'
            ),
            short_description=u'Applicant',
            admin_order_field=u'applicant__email',
        ),
        decorate(
            lambda o: admin_obj_format(o.main_branch.obligee, u'{obj.name}'),
            short_description=u'Obligee',
            admin_order_field=u'branch__obligee__name',
        ),
        u'subject',
        u'submission_date',
        decorate(
            lambda o: o.undecided_emails_count,
            short_description=u'Undecided E-mails',
            admin_order_field=u'undecided_emails_count',
        ),
        u'closed',
    ]
    list_filter = [
        u'submission_date',
        simple_list_filter_factory(u'Undecided E-mail', u'undecided', [
            (u'1', u'With',
             lambda qs: qs.filter(undecided_emails_count__gt=0)),
            (u'0', u'Without', lambda qs: qs.filter(undecided_emails_count=0)),
        ]),
        u'closed',
    ]
    search_fields = [
        u'=id',
        u'applicant__first_name',
        u'applicant__last_name',
        u'applicant__email',
        u'branch__obligee__name',
        u'unique_email',
        u'subject',
    ]
    ordering = [
        u'-submission_date',
        u'-id',
    ]
    exclude = []
    readonly_fields = []
    raw_id_fields = [
        u'applicant',
    ]
    inlines = []

    def get_queryset(self, request):
        queryset = super(InforequestAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'applicant')
        queryset = queryset.select_undecided_emails_count()
        queryset = queryset.prefetch_related(
            Inforequest.prefetch_main_branch(
                None, Branch.objects.select_related(u'obligee')))
        return queryset
Пример #11
0
class BranchAdmin(AdminLiveFieldsMixin, admin.ModelAdmin):
    list_display = [
            u'branch_column',
            u'inforequest_column',
            u'inforequest_closed_column',
            u'inforequest_applicant_column',
            u'obligee_column',
            u'main_branch_column',
            ]
    list_filter = [
            simple_list_filter_factory(u'Main Branch', u'mainbranch', [
                (u'1', u'Yes', lambda qs: qs.main()),
                (u'0', u'No',  lambda qs: qs.advanced()),
                ]),
            u'inforequest__closed',
            ]
    search_fields = [
            u'=id',
            u'=inforequest__pk',
            u'inforequest__applicant__first_name',
            u'inforequest__applicant__last_name',
            u'inforequest__applicant__email',
            u'obligee__name',
            ]
    ordering = [u'-pk']

    @decorate(short_description=u'Branch')
    @decorate(admin_order_field=u'pk')
    def branch_column(self, branch):
        return admin_obj_format(branch, link=False)

    @decorate(short_description=u'Inforequest')
    @decorate(admin_order_field=u'inforequest__pk')
    def inforequest_column(self, branch):
        inforequest = branch.inforequest
        return admin_obj_format(inforequest)

    @decorate(short_description=u'Closed')
    @decorate(admin_order_field=u'inforequest__closed')
    @decorate(boolean=True)
    def inforequest_closed_column(self, inforequestemail):
        return inforequestemail.inforequest.closed

    @decorate(short_description=u'Applicant')
    @decorate(admin_order_field=u'inforequest__applicant__email')
    def inforequest_applicant_column(self, branch):
        user = branch.inforequest.applicant
        return admin_obj_format(user, u'{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'Obligee')
    @decorate(admin_order_field=u'obligee__name')
    def obligee_column(self, branch):
        obligee = branch.obligee
        return admin_obj_format(obligee, u'{obj.name}')

    @decorate(short_description=u'Main Branch')
    @decorate(admin_order_field=u'advanced_by')
    @decorate(boolean=True)
    def main_branch_column(self, branch):
        return branch.is_main

    form_add = BranchAdminAddForm
    form_change = BranchAdminChangeForm
    fieldsets = [
            (None, {
                u'classes': [u'wide'],
                u'fields': [
                    u'inforequest',
                    u'obligee',
                    u'obligee_details_live',
                    u'historicalobligee',
                    u'historicalobligee_details_live',
                    u'advanced_by',
                    u'advanced_by_details_live',
                    u'advanced_by_branch_live',
                    u'advanced_by_inforequest_live',
                    u'advanced_by_applicant_live',
                    u'advanced_by_closed_live',
                    ],
                }),
            ]
    fieldsets_add = [
            (None, {
                u'classes': [u'wide'],
                u'fields': [
                    u'obligee',
                    u'obligee_details_live',
                    u'advanced_by',
                    u'advanced_by_details_live',
                    u'advanced_by_branch_live',
                    u'advanced_by_inforequest_live',
                    u'advanced_by_applicant_live',
                    u'advanced_by_closed_live',
                    ],
                }),
            ]
    raw_id_fields = [
            u'inforequest',
            u'obligee',
            u'historicalobligee',
            u'advanced_by',
            ]
    live_fields = [
            u'obligee_details_live',
            u'historicalobligee_details_live',
            u'advanced_by_details_live',
            u'advanced_by_branch_live',
            u'advanced_by_inforequest_live',
            u'advanced_by_applicant_live',
            u'advanced_by_closed_live',
            ]
    readonly_fields = live_fields
    inlines = [
            BranchAdminActionInline,
            ]

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'obligee')
    def obligee_details_live(self, obligee):
        return admin_obj_format(obligee, u'{tag}\n{obj.name}')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'historicalobligee')
    def historicalobligee_details_live(self, historicalobligee):
        return admin_obj_format(historicalobligee, u'{tag}\n{obj.name}')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'advanced_by')
    def advanced_by_details_live(self, advanced_by):
        action = advanced_by
        return admin_obj_format(action, u'{tag} {0}', action.get_type_display()) if action else u'--'

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Branch'))
    @live_field(u'advanced_by')
    def advanced_by_branch_live(self, advanced_by):
        branch = advanced_by.branch if advanced_by else None
        return admin_obj_format(branch)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Inforequest'))
    @live_field(u'advanced_by')
    def advanced_by_inforequest_live(self, advanced_by):
        inforequest = advanced_by.branch.inforequest if advanced_by else None
        return admin_obj_format(inforequest)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Applicant'))
    @live_field(u'advanced_by')
    def advanced_by_applicant_live(self, advanced_by):
        user = advanced_by.branch.inforequest.applicant if advanced_by else None
        return admin_obj_format(user, u'{tag}\n{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Closed'))
    @live_field(u'advanced_by')
    def advanced_by_closed_live(self, advanced_by):
        return _boolean_icon(advanced_by.branch.inforequest.closed) if advanced_by else u'--'

    def has_delete_permission(self, request, obj=None):
        if not obj:
            return True
        # Only advanced branches may be deleted. If we want to delete a main branch, we must delete
        # its inforequest.
        return not obj.is_main

    def get_queryset(self, request):
        queryset = super(BranchAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'inforequest__applicant')
        queryset = queryset.select_related(u'obligee')
        return queryset

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            return self.fieldsets_add
        return super(BranchAdmin, self).get_fieldsets(request, obj)

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            self.form = self.form_add
            form = super(BranchAdmin, self).get_form(request, obj, **kwargs)
        else:
            self.form = self.form_change
            form = super(BranchAdmin, self).get_form(request, obj, **kwargs)
        return form

    def get_formsets(self, request, obj=None):
        if obj is None:
            return []
        return super(BranchAdmin, self).get_formsets(request, obj)
Пример #12
0
class ActionAdmin(AdminLiveFieldsMixin, admin.ModelAdmin):
    list_display = [
        u'action_column',
        u'branch_column',
        u'branch_inforequest_column',
        u'branch_closed_column',
        u'branch_applicant_column',
        u'branch_obligee_column',
        u'email_column',
        u'type',
        u'effective_date',
    ]
    list_filter = [
        u'type',
        u'effective_date',
        simple_list_filter_factory(u'E-mail', u'email', [
            (u'1', u'Yes', lambda qs: qs.by_email()),
            (u'0', u'No', lambda qs: qs.by_smail()),
        ]),
        u'branch__inforequest__closed',
    ]
    search_fields = [
        u'=id',
        u'=branch__pk',
        u'=branch__inforequest__pk',
        u'branch__inforequest__applicant__first_name',
        u'branch__inforequest__applicant__last_name',
        u'branch__inforequest__applicant__email',
        u'branch__obligee__name',
        u'=email__pk',
    ]
    ordering = [u'-effective_date', u'-pk']

    @decorate(short_description=u'Action')
    @decorate(admin_order_field=u'pk')
    def action_column(self, action):
        return admin_obj_format(action, link=False)

    @decorate(short_description=u'Branch')
    @decorate(admin_order_field=u'branch__pk')
    def branch_column(self, action):
        branch = action.branch
        return admin_obj_format(branch)

    @decorate(short_description=u'Inforequest')
    @decorate(admin_order_field=u'branch__inforequest__pk')
    def branch_inforequest_column(self, action):
        inforequest = action.branch.inforequest
        return admin_obj_format(inforequest)

    @decorate(short_description=u'Closed')
    @decorate(admin_order_field=u'branch__inforequest__closed')
    @decorate(boolean=True)
    def branch_closed_column(self, action):
        return action.branch.inforequest.closed

    @decorate(short_description=u'Applicant')
    @decorate(admin_order_field=u'branch__inforequest__applicant__email')
    def branch_applicant_column(self, action):
        user = action.branch.inforequest.applicant
        return admin_obj_format(
            user, u'{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'Obligee')
    @decorate(admin_order_field=u'branch__obligee__name')
    def branch_obligee_column(self, action):
        obligee = action.branch.obligee
        return admin_obj_format(obligee, u'{obj.name}')

    @decorate(short_description=u'Email')
    @decorate(admin_order_field=u'email__pk')
    def email_column(self, action):
        email = action.email
        return admin_obj_format(email)

    form_add = ActionAdminAddForm
    form_change = ActionAdminChangeForm
    fieldsets = [
        (None, {
            u'classes': [u'wide'],
            u'fields': [
                u'inforequest_field',
                u'branch',
                u'branch_details_live',
                u'branch_inforequest_live',
                u'branch_applicant_live',
                u'branch_obligee_live',
                u'branch_closed_live',
                u'email',
                u'email_details_live',
                u'email_assigned_to_live',
                u'email_from_live',
                u'email_subject_live',
                u'type',
                u'type_details_live',
                u'subject',
                u'content',
                u'effective_date',
                u'deadline',
                u'extension',
                u'deadline_details_live',
                u'disclosure_level',
                u'refusal_reason',
            ],
        }),
        (u'Advanced', {
            u'classes': [u'wide', u'collapse'],
            u'fields': [
                u'last_deadline_reminder',
            ],
        }),
    ]
    fieldsets_add = [
        (None, {
            u'classes': [u'wide'],
            u'fields': [
                u'branch',
                u'branch_details_live',
                u'branch_inforequest_live',
                u'branch_applicant_live',
                u'branch_obligee_live',
                u'branch_closed_live',
                u'type',
                u'type_details_live',
                u'subject',
                u'content',
                u'attachments',
                u'effective_date',
                u'deadline',
                u'extension',
                u'deadline_details_live',
                u'disclosure_level',
                u'refusal_reason',
                u'obligee_set',
                u'obligee_set_details_live',
                u'send_email',
            ],
        }),
    ]
    raw_id_fields = [
        u'branch',
        u'email',
    ]
    live_fields = [
        u'branch_details_live',
        u'branch_inforequest_live',
        u'branch_applicant_live',
        u'branch_obligee_live',
        u'branch_closed_live',
        u'email_details_live',
        u'email_assigned_to_live',
        u'email_from_live',
        u'email_subject_live',
        u'type_details_live',
        u'deadline_details_live',
        u'obligee_set_details_live',
    ]
    readonly_fields = live_fields + [
        u'inforequest_field',
    ]
    inlines = [
        AttachmentInline,
        ActionAdminAdvancedToInline,
    ]

    @decorate(short_description=u'Inforequest')
    def inforequest_field(self, action):
        inforequest = action.branch.inforequest if action else None
        return admin_obj_format(inforequest)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'branch')
    def branch_details_live(self, branch):
        return admin_obj_format(branch)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Inforequest'))
    @live_field(u'branch')
    def branch_inforequest_live(self, branch):
        inforequest = branch.inforequest if branch else None
        return admin_obj_format(inforequest)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Applicant'))
    @live_field(u'branch')
    def branch_applicant_live(self, branch):
        user = branch.inforequest.applicant if branch else None
        return admin_obj_format(
            user, u'{tag}\n{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Obligee'))
    @live_field(u'branch')
    def branch_obligee_live(self, branch):
        obligee = branch.obligee if branch else None
        return admin_obj_format(obligee, u'{tag}\n{obj.name}')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Closed'))
    @live_field(u'branch')
    def branch_closed_live(self, branch):
        return _boolean_icon(branch.inforequest.closed) if branch else u'--'

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'email')
    def email_details_live(self, email):
        return admin_obj_format(email)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Assigned To'))
    @live_field(u'email')
    def email_assigned_to_live(self, email):
        inforequests = email.inforequest_set.all() if email else []
        return admin_obj_format_join(u', ', inforequests)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'From'))
    @live_field(u'email')
    def email_from_live(self, email):
        return email.from_formatted if email else u'--'

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Subject'))
    @live_field(u'email')
    def email_subject_live(self, email):
        return email.subject if email else u'--'

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'type')
    def type_details_live(self, type):
        return ActionAdmin.type_details_live_aux(type)

    @classmethod
    def type_details_live_aux(cls, type):
        try:
            type = int(type)
        except (ValueError, TypeError):
            return u'--'

        if type in Action.APPLICANT_ACTION_TYPES:
            return u'Applicant Action'
        elif type in Action.OBLIGEE_ACTION_TYPES:
            return u'Obligee Action'
        elif type in Action.IMPLICIT_ACTION_TYPES:
            return u'Implicit Action'
        else:
            return u'--'

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'effective_date', u'deadline', u'extension')
    def deadline_details_live(self, effective_date, deadline, extension):
        return ActionAdmin.deadline_details_live_aux(effective_date, deadline,
                                                     extension)

    @classmethod
    def deadline_details_live_aux(cls, effective_date, deadline, extension):
        try:
            deadline = int(deadline)
            extension = int(extension or '0')
        except (ValueError, TypeError):
            return u'--'

        for format in get_format(u'DATE_INPUT_FORMATS'):
            try:
                effective_date = datetime.datetime.strptime(
                    effective_date, format).date()
                break
            except (ValueError, TypeError):
                continue
        else:
            return u'--'

        days_passed = workdays.between(effective_date, local_today())
        deadline_remaining = deadline + extension - days_passed
        deadline_missed = (deadline_remaining < 0)

        if deadline_missed:
            return u'Deadline was missed {days} working days ago.'.format(
                days=-deadline_remaining)
        else:
            return u'Deadline will be missed in {days} working days.'.format(
                days=deadline_remaining)

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'obligee_set')
    def obligee_set_details_live(self, obligee_pks):
        obligee_pks = obligee_pks.split(u',') if obligee_pks else []
        obligees = [
            try_except(lambda: Obligee.objects.get(pk=pk), None)
            for pk in obligee_pks
        ]
        return admin_obj_format_join(u'\n', obligees, u'{tag} {obj.name}')

    def has_delete_permission(self, request, obj=None):
        if not obj:
            return True
        # Branches may not be left empty.
        return obj.branch.action_set.count() > 1

    def get_queryset(self, request):
        queryset = super(ActionAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'branch__inforequest__applicant')
        queryset = queryset.select_related(u'branch__obligee')
        queryset = queryset.select_related(u'email')
        return queryset

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            return self.fieldsets_add
        return super(ActionAdmin, self).get_fieldsets(request, obj)

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            self.form = self.form_add
            form = super(ActionAdmin, self).get_form(request, obj, **kwargs)
            session = Session.objects.get(
                session_key=request.session.session_key)
            form = partial(form, attached_to=session)
        else:
            self.form = self.form_change
            form = super(ActionAdmin, self).get_form(request, obj, **kwargs)
        return form

    def get_formsets(self, request, obj=None):
        if obj is None:
            return []
        return super(ActionAdmin, self).get_formsets(request, obj)
Пример #13
0
class InforequestAdmin(AdminLiveFieldsMixin, admin.ModelAdmin):
    list_display = [
        u'inforequest_column',
        u'applicant_column',
        u'obligee_column',
        u'unique_email',
        u'submission_date',
        u'closed',
        u'undecided_emails_column',
    ]
    list_filter = [
        u'submission_date',
        simple_list_filter_factory(u'Undecided E-mail', u'undecided', [
            (u'1', u'With',
             lambda qs: qs.filter(undecided_emails_count__gt=0)),
            (u'0', u'Without', lambda qs: qs.filter(undecided_emails_count=0)),
        ]),
        u'closed',
    ]
    search_fields = [
        u'=id',
        u'applicant__first_name',
        u'applicant__last_name',
        u'applicant__email',
        u'branch__obligee__name',
        u'unique_email',
    ]
    ordering = [u'-submission_date', u'-pk']

    @decorate(short_description=u'Inforequest')
    @decorate(admin_order_field=u'pk')
    def inforequest_column(self, inforequest):
        return admin_obj_format(inforequest, link=False)

    @decorate(short_description=u'Applicant')
    @decorate(admin_order_field=u'applicant__email')
    def applicant_column(self, inforequest):
        user = inforequest.applicant
        return admin_obj_format(
            user, u'{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'Obligee')
    @decorate(admin_order_field=u'branch__obligee__name')
    def obligee_column(self, inforequest):
        obligee = inforequest.main_branch.obligee
        return admin_obj_format(obligee, u'{obj.name}')

    @decorate(short_description=u'Undecided E-mails')
    @decorate(admin_order_field=u'undecided_emails_count')
    def undecided_emails_column(self, inforequest):
        return inforequest.undecided_emails_count

    form_add = InforequestAdminAddForm
    form_change = forms.ModelForm
    fieldsets = [
        (None, {
            u'classes': [u'wide'],
            u'fields': [
                u'applicant',
                u'applicant_details_live',
                u'obligee_details_field',
                u'applicant_name',
                (u'applicant_street', u'applicant_city', u'applicant_zip'),
                u'unique_email',
                u'submission_date',
                u'closed',
                u'undecided_emails_field',
            ],
        }),
        (u'Advanced', {
            u'classes': [u'wide', u'collapse'],
            u'fields': [
                u'last_undecided_email_reminder',
            ],
        }),
    ]
    fieldsets_add = [
        (None, {
            u'fields': [
                u'applicant',
                u'applicant_details_live',
                u'obligee',
                u'obligee_details_live',
                u'subject',
                u'content',
                u'attachments',
                u'send_email',
            ],
        }),
    ]
    live_fields = [
        u'applicant_details_live',
        u'obligee_details_live',
    ]
    readonly_fields = live_fields + [
        u'obligee_details_field',
        u'submission_date',
        u'undecided_emails_field',
    ]
    raw_id_fields = [
        u'applicant',
    ]
    inlines = [
        InforequestAdminBranchInline,
        InforequestAdminInforequestEmailInline,
    ]

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'applicant')
    def applicant_details_live(self, applicant):
        user = applicant
        return admin_obj_format(
            user, u'{tag}\n{obj.first_name} {obj.last_name} <{obj.email}>')

    @decorate(short_description=u'%s%s' % (ADMIN_FIELD_INDENT, u'Details'))
    @live_field(u'obligee')
    def obligee_details_live(self, obligee_pk):
        obligee = try_except(lambda: Obligee.objects.get(pk=obligee_pk), None)
        return admin_obj_format(obligee, u'{tag}\n{obj.name}')

    @decorate(short_description=u'Obligee')
    def obligee_details_field(self, inforequest):
        obligee = inforequest.main_branch.obligee
        return admin_obj_format(obligee, u'{tag}\n{obj.name}')

    @decorate(short_description=u'Undecided E-mails')
    def undecided_emails_field(self, inforequest):
        return inforequest.undecided_emails_count

    def get_queryset(self, request):
        queryset = super(InforequestAdmin, self).get_queryset(request)
        queryset = queryset.select_related(u'applicant')
        queryset = queryset.select_undecided_emails_count()
        queryset = queryset.prefetch_related(
            Inforequest.prefetch_main_branch(
                None, Branch.objects.select_related(u'obligee')))
        return queryset

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            return self.fieldsets_add
        return super(InforequestAdmin, self).get_fieldsets(request, obj)

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            self.form = self.form_add
            form = super(InforequestAdmin,
                         self).get_form(request, obj, **kwargs)
            session = Session.objects.get(
                session_key=request.session.session_key)
            form = partial(form, attached_to=session)
        else:
            self.form = self.form_change
            form = super(InforequestAdmin,
                         self).get_form(request, obj, **kwargs)
        return form

    def get_formsets(self, request, obj=None):
        if obj is None:
            return []
        return super(InforequestAdmin, self).get_formsets(request, obj)