Пример #1
0
class ImageInline(
        admin.TabularInline,
        ThumbAdmin,
):
    form = modelform_factory(StoryImage, exclude=())
    formfield_overrides = {
        models.CharField: {
            'widget': Textarea(attrs={
                'rows': 5,
                'cols': 30
            })
        },
    }
    model = StoryImage
    fields = [
        'top',
        'index',
        'caption',
        'creditline',
        'size',
        'aspect_ratio',
        'imagefile',
        'thumbnail',
    ]
    readonly_fields = ('thumbnail', )
    extra = 0
Пример #2
0
class LinkAdmin(admin.ModelAdmin):
    model = Link
    list_display_links = ('id',)
    list_display = ('id', 'resource', 'extension', 'link_type', 'name', 'mime')
    list_filter = ('resource', 'extension', 'link_type', 'mime')
    search_fields = ('name', 'resource__title',)
    form = modelform_factory(Link, fields='__all__')
Пример #3
0
class ActivitySectorInline(nested_admin.NestedStackedInline):
    model = ActivitySector
    classes = ('collapse open', )
    inline_classes = ('collapse open', )
    extra = 6

    form = autocomplete_forms.modelform_factory(Sector, fields='__all__')
Пример #4
0
class ImageFileAdmin(
        AdminImageMixin,
        ThumbAdmin,
        admin.ModelAdmin,
):
    form = modelform_factory(ImageFile, exclude=())
    actions = [autocrop]
    date_hierarchy = 'created'
    actions_on_top = True
    actions_on_bottom = True
    save_on_top = True
    list_per_page = 25
    list_display = (
        'id',
        'created',
        'source_file',
        'contributor',
        'cropping_method',
        'crop_diameter',
        'from_left',
        'from_top',
        'thumbnail',
    )
    list_editable = (
        'crop_diameter',
        'from_left',
        'from_top',
    )
    search_fields = (
        'source_file',
        'storyimage__caption',
        'frontpagestory__headline',
    )
Пример #5
0
class ActivityRecipientCountryInline(nested_admin.NestedStackedInline):
    model = ActivityRecipientCountry
    classes = ('collapse open', )
    inline_classes = ('collapse open', )
    extra = 6

    form = autocomplete_forms.modelform_factory(ActivityRecipientCountry,
                                                fields='__all__')
Пример #6
0
class MapLayerAdmin(admin.ModelAdmin):
    list_display = ('id', 'map', 'name')
    list_filter = ('map', )
    search_fields = (
        'map__title',
        'name',
    )
    form = modelform_factory(MapLayer, fields='__all__')
Пример #7
0
class DocumentCategoryInline(nested_admin.NestedStackedInline):
    model = DocumentLinkCategory
    classes = ('collapse open', )
    inline_classes = ('collapse open', )
    fields = ('document_link', 'category')
    extra = 1

    form = autocomplete_forms.modelform_factory(DocumentCategory,
                                                fields='__all__')
Пример #8
0
class FrontpageStoryInline(SmallTextArea, admin.TabularInline, ThumbAdmin):
    form = modelform_factory(FrontpageStory, exclude=())
    model = FrontpageStory
    fields = (
        'headline',
        'kicker',
        'lede',
        'imagefile',
        'thumbnail',
    ),
    readonly_fields = ('thumbnail', )
    extra = 0
Пример #9
0
class StintAdmin(admin.ModelAdmin):

    form = modelform_factory(Stint, exclude=())

    list_display = (
        '__str__',
        'position',
        'start_date',
        'end_date',
    )

    list_editable = (
        'position',
        'start_date',
        'end_date',
    )
Пример #10
0
class BylineInline(admin.TabularInline):
    form = modelform_factory(Byline, exclude=())
    model = Byline
    fields = (
        'ordering',
        'credit',
        'contributor',
        'title',
    )
    extra = 0
    max_num = 20
    formfield_overrides = {
        models.CharField: {
            'widget': TextInput(attrs={'style': 'width:400px;'})
        },
    }
Пример #11
0
class BylineAdmin(admin.ModelAdmin):
    form = modelform_factory(Byline, exclude=())
    list_display = (
        'id',
        'story',
        'contributor',
        'credit',
        'title',
    )
    list_editable = (
        'credit',
        'title',
    )

    raw_id_fields = (
        # 'story',
        # 'contributor',
    )
Пример #12
0
class StoryTypeAdmin(admin.ModelAdmin):
    form = modelform_factory(StoryType, exclude=[])
    list_display = (
        'id',
        'name',
        'section',
        'template',
        'prodsys_mappe',
    )

    list_editable = (
        'name',
        'section',
        # 'prodsys_mappe',
    )

    raw_id_fields = (
        # 'template',
    )
Пример #13
0
class TransactionInline(nested_admin.NestedStackedInline):
    model = Transaction
    classes = ('collapse open', )
    inline_classes = ('collapse open', )

    fields = (
        'transaction_type',
        'value',
        'currency',
        'value_date',
        'transaction_date',
        'transaction_provider',
        'transaction_receiver',
        'edit_transaction',
    )
    readonly_fields = ('edit_transaction', 'transaction_provider',
                       'transaction_receiver')

    form = autocomplete_forms.modelform_factory(Transaction, fields='__all__')

    def transaction_provider(self, obj):
        try:
            return obj.provider_organisation.narratives.all()[0].content
        except Exception as e:
            return 'no provider name'

    def transaction_receiver(self, obj):
        try:
            return obj.receiver_organisation.narratives.all()[0].content
        except Exception as e:
            return 'no receiver name'

    def edit_transaction(self, obj):

        if obj.id:
            return format_html(
                '<a href="/admin/iati/transaction/{}/" onclick="return showAddAnotherPopup(this);">Edit details</a>',
                str(obj.id))
        else:
            return format_html(
                'Please save the activity to edit receiver/provider details')

    extra = 6
Пример #14
0
class LinkAdmin(admin.ModelAdmin):
    form = modelform_factory(InlineLink, exclude=())
    actions_on_bottom = actions_on_top = True
    actions = [find_linked_story, check_link_status]
    list_display = (
        'id',
        'parent_story',
        'number',
        'alt_text',
        'get_html',
        'get_tag',
        'link',
        # 'linked_story',
        'status_code',
    )
    list_editable = (
        'alt_text',
        # 'href',
    )
    list_filter = ('status_code', )
Пример #15
0
class TransactionProviderInline(nested_admin.NestedStackedInline):
    model = TransactionProvider
    inlines = [
        NarrativeInline,
    ]
    classes = ('collapse open', )
    inline_classes = ('collapse open', )
    exclude = ('normalized_ref', 'organisation', 'provider_activity',
               'primary_name')

    form = autocomplete_forms.modelform_factory(TransactionProvider,
                                                fields='__all__')
    extra = 1

    def save_model(self, request, obj, form, change):
        obj.normalized_ref = obj.ref
        if obj.provider_activity:
            obj.provider_activity_ref = obj.provider_activity.id
        return super(TransactionProviderInline,
                     self).save_model(request, obj, form, change)
Пример #16
0
class ContributorAdmin(admin.ModelAdmin):

    form = modelform_factory(Contributor, exclude=())

    list_display = (
        'display_name',
        'bylines_count',
        'verified',
        'status',
        byline_image,
    )

    list_editable = ('verified', )

    search_fields = ('display_name', )

    inlines = [
        StintInline,
        BylineInline,
    ]
Пример #17
0
class ProfileAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'username',
        'organization',
    )
    search_fields = (
        'username',
        'organization',
        'profile',
    )
    modelform_factory(Profile, fields='__all__')
    add_form_template = 'admin/auth/user/add_form.html'
    change_user_password_template = None
    fieldsets = (
        (None, {
            'fields': ('username', 'password')
        }),
        (_('Personal info'), {
            'fields': ('first_name', 'last_name', 'email')
        }),
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups')
        }),
        (_('Important dates'), {
            'fields': ('last_login', 'date_joined')
        }),
        (_('Extended profile'), {
            'fields':
            ('organization', 'profile', 'position', 'voice', 'fax', 'delivery',
             'city', 'area', 'zipcode', 'country', 'keywords')
        }),
    )
    add_fieldsets = ((None, {
        'classes': ('wide', ),
        'fields': ('username', 'password1', 'password2')
    }), )
    form = ProfileChangeForm
    add_form = ProfileCreationForm
    change_password_form = AdminPasswordChangeForm
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff',
                    'is_active')
    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
    search_fields = ('username', 'first_name', 'last_name', 'email')
    ordering = ('username', )
    filter_horizontal = (
        'groups',
        'user_permissions',
    )

    def get_fieldsets(self, request, obj=None):
        if not obj:
            return self.add_fieldsets
        return super(ProfileAdmin, self).get_fieldsets(request, obj)

    def get_form(self, request, obj=None, **kwargs):
        """
        Use special form during user creation
        """
        defaults = {}
        if obj is None:
            defaults.update({
                'form':
                self.add_form,
                'fields':
                admin.utils.flatten_fieldsets(self.add_fieldsets),
            })
        defaults.update(kwargs)
        return super(ProfileAdmin, self).get_form(request, obj, **defaults)

    def get_urls(self):
        from django.conf.urls import patterns
        return patterns(
            '',
            (r'^(\d+)/password/$',
             self.admin_site.admin_view(self.user_change_password))) + super(
                 ProfileAdmin, self).get_urls()

    def lookup_allowed(self, lookup, value):
        # See #20078: we don't want to allow any lookups involving passwords.
        if lookup.startswith('password'):
            return False
        return super(ProfileAdmin, self).lookup_allowed(lookup, value)

    @sensitive_post_parameters_m
    @csrf_protect_m
    @transaction.atomic
    def add_view(self, request, form_url='', extra_context=None):
        # It's an error for a user to have add permission but NOT change
        # permission for users. If we allowed such users to add users, they
        # could create superusers, which would mean they would essentially have
        # the permission to change users. To avoid the problem entirely, we
        # disallow users from adding users if they don't have change
        # permission.
        if not self.has_change_permission(request):
            if self.has_add_permission(request) and settings.DEBUG:
                # Raise Http404 in debug mode so that the user gets a helpful
                # error message.
                raise Http404(
                    'Your user does not have the "Change user" permission. In '
                    'order to add users, Django requires that your user '
                    'account have both the "Add user" and "Change user" '
                    'permissions set.')
            raise PermissionDenied
        if extra_context is None:
            extra_context = {}
        username_field = self.model._meta.get_field(self.model.USERNAME_FIELD)
        defaults = {
            'auto_populated_fields': (),
            'username_help_text': username_field.help_text,
        }
        extra_context.update(defaults)
        return super(ProfileAdmin, self).add_view(request, form_url,
                                                  extra_context)

    @sensitive_post_parameters_m
    def user_change_password(self, request, id, form_url=''):
        if not self.has_change_permission(request):
            raise PermissionDenied
        user = get_object_or_404(self.get_queryset(request), pk=id)
        if request.method == 'POST':
            form = self.change_password_form(user, request.POST)
            if form.is_valid():
                form.save()
                change_message = self.construct_change_message(
                    request, form, None)
                self.log_change(request, user, change_message)
                msg = ugettext('Password changed successfully.')
                messages.success(request, msg)
                return HttpResponseRedirect('..')
        else:
            form = self.change_password_form(user)

        fieldsets = [(None, {'fields': list(form.base_fields)})]
        adminForm = admin.helpers.AdminForm(form, fieldsets, {})

        context = {
            'title': _('Change password: %s') % escape(user.get_username()),
            'adminForm': adminForm,
            'form_url': form_url,
            'form': form,
            'is_popup': IS_POPUP_VAR in request.REQUEST,
            'add': True,
            'change': False,
            'has_delete_permission': False,
            'has_change_permission': True,
            'has_absolute_url': False,
            'opts': self.model._meta,
            'original': user,
            'save_as': False,
            'show_save': True,
        }
        return TemplateResponse(request,
                                self.change_user_password_template
                                or 'admin/auth/user/change_password.html',
                                context,
                                current_app=self.admin_site.name)

    def response_add(self, request, obj, post_url_continue=None):
        """
        Determines the HttpResponse for the add_view stage. It mostly defers to
        its superclass implementation but is customized because the User model
        has a slightly different workflow.
        """
        # We should allow further modification of the user just added i.e. the
        # 'Save' button should behave like the 'Save and continue editing'
        # button except in two scenarios:
        # * The user has pressed the 'Save and add another' button
        # * We are adding a user in a popup
        if '_addanother' not in request.POST and IS_POPUP_VAR not in request.POST:
            request.POST['_continue'] = 1
        return super(ProfileAdmin, self).response_add(request, obj,
                                                      post_url_continue)
Пример #18
0
class ActivityAdmin(nested_admin.NestedAdmin):
    search_fields = ['id']
    exclude = ('activity_aggregations', 'planned_start', 'actual_start',
               'start_date', 'planned_end', 'actual_end', 'end_date',
               'is_searchable', 'default_lang')
    list_display = ['__unicode__']
    inlines = [
        ActivityDateInline,
        ActivityReportingOrganisationInline,
        ActivityParticipatingOrganisationInline,
        ActivityPolicyMarkerInline,
        ActivityRecipientCountryInline,
        ActivitySectorInline,
        ActivityRecipientRegionInline,
        BudgetInline,
        TitleInline,
        DescriptionInline,
        DocumentLinkInline,
        ResultInline,
        LocationInline,
        RelatedActivityInline,
        TransactionInline,
    ]

    form = autocomplete_forms.modelform_factory(Activity, fields='__all__')

    def get_inline_instances(self, request, obj=None):
        if obj is None:
            return []

        inline_instances = super(ActivityAdmin,
                                 self).get_inline_instances(request, obj)

        return inline_instances

    def save_model(self, request, obj, form, change):
        obj.last_updated_datetime = datetime.datetime.now()

        super(ActivityAdmin, self).save_model(request, obj, form, change)

        try:
            if obj.title.id is None:
                obj.title.save()
        except ObjectDoesNotExist:
            title = Title()
            title.activity = obj
            title.save()

        if not obj.description_set.count():
            description = Description()
            description.activity = obj
            description.save()

        if not change:
            obj.default_lang = 'en'

        self.act = obj

    def save_formset(self, request, form, formset, change):
        if formset.model == Narrative:
            for entry in formset.cleaned_data:
                if entry and entry['id'] is None:
                    if isinstance(formset.instance, DocumentLinkTitle):
                        formset.instance.document_link_id = formset.instance.document_link.id
                        formset.instance.save()
                    entry['activity'] = self.act

        super(ActivityAdmin, self).save_formset(request, form, formset, change)

        # set derived activity dates (used for sorting)
        if formset.model == ActivityDate:

            activity = form.instance
            for ad in activity.activitydate_set.all():
                if ad.type.code == '1':
                    activity.planned_start = ad.iso_date
                if ad.type.code == '2':
                    activity.actual_start = ad.iso_date
                if ad.type.code == '3':
                    activity.planned_end = ad.iso_date
                if ad.type.code == '4':
                    activity.actual_end = ad.iso_date

            if activity.actual_start:
                activity.start_date = activity.actual_start
            else:
                activity.start_date = activity.planned_start

            if activity.actual_end:
                activity.end_date = activity.actual_end
            else:
                activity.end_date = activity.planned_end
            activity.save()

        # save primary name on participating organisation to make querying work
        if isinstance(formset.instance, ActivityParticipatingOrganisation):
            if formset.cleaned_data[0]:
                po = formset.instance
                if po.narratives.all().count() > 0:
                    po.primary_name = po.narratives.all()[0].content.strip()
                    po.save()

        # update aggregations after save of last inline form
        if formset.model == Transaction:
            aggregation_calculator = ActivityAggregationCalculation()
            aggregation_calculator.parse_activity_aggregations(form.instance)

    def save_related(self, request, form, formsets, change):
        super(ActivityAdmin, self).save_related(request, form, formsets,
                                                change)
        post_save.set_derived_activity_dates(self.act)
        post_save.set_activity_aggregations(self.act)
        post_save.update_activity_search_index(self.act)

        # remove old
        BudgetSector.objects.filter(budget__activity=self.act).delete()
        TransactionSector.objects.filter(
            transaction__activity=self.act).delete()
        TransactionRecipientCountry.objects.filter(
            transaction__activity=self.act).delete()
        TransactionRecipientRegion.objects.filter(
            transaction__activity=self.act).delete()

        # add new
        post_save.set_country_region_transaction(self.act)
        post_save.set_sector_transaction(self.act)
        post_save.set_sector_budget(self.act)
Пример #19
0
class ContactRoleAdmin(admin.ModelAdmin):
    model = ContactRole
    list_display_links = ('id',)
    list_display = ('id', 'contact', 'resource', 'role')
    list_editable = ('contact', 'resource', 'role')
    form = modelform_factory(ContactRole, fields='__all__')
Пример #20
0
class TransactionAdmin(nested_admin.NestedAdmin):
    search_fields = ['activity__id']
    readonly_fields = ['activity']
    list_display = ['__unicode__']
    exclude = (
        'value_string',
        'xdr_value',
        'usd_value',
        'eur_value',
        'gbp_value',
        'jpy_value',
        'cad_value',
    )
    inlines = [
        TransactionDescriptionInline,
        TransactionProviderInline,
        TransactionReceiverInline,
    ]

    form = autocomplete_forms.modelform_factory(Transaction, fields='__all__')

    def get_inline_instances(self, request, obj=None):
        if obj is None:
            return []

        inline_instances = super(TransactionAdmin,
                                 self).get_inline_instances(request, obj)

        return inline_instances

    def get_object(self, request, object_id, from_field=None):
        obj = super(TransactionAdmin, self).get_object(request, object_id)

        # if not getattr(obj, 'receiver_organisation', None):
        #     transaction_receiver = TransactionReceiver()
        #     transaction_receiver.transaction = obj
        #     transaction_receiver.save()
        #     obj.receiver_organisation = transaction_receiver
        #
        # if not getattr(obj, 'provider_organisation', None):
        #     transaction_provider = TransactionProvider()
        #     transaction_provider.transaction = obj
        #     transaction_provider.save()
        #     obj.provider_organisation = transaction_provider

        self.act = obj.activity

        return obj

    def save_formset(self, request, form, formset, change):
        if formset.model == Narrative:
            for entry in formset.cleaned_data:
                if entry and entry['id'] is None:
                    entry['activity'] = self.act

        super(TransactionAdmin, self).save_formset(request, form, formset,
                                                   change)

        if formset.model == TransactionDescription:
            try:
                if formset.instance.description.id is None:
                    formset.instance.description.save()
            except ObjectDoesNotExist:
                pass

        if formset.model == TransactionProvider:
            try:
                if formset.instance.provider_organisation.id is None:
                    formset.instance.provider_organisation.save()
            except ObjectDoesNotExist:
                pass

        if isinstance(formset.instance, TransactionProvider):
            if formset.cleaned_data[0]:
                tp = formset.instance
                if tp.narratives.all().count() > 0:
                    tp.primary_name = tp.narratives.all()[0].content.strip()
                    tp.save()

        if isinstance(formset.instance, TransactionReceiver):
            if formset.cleaned_data[0]:
                tr = formset.instance
                if tr.narratives.all().count() > 0:
                    tr.primary_name = tr.narratives.all()[0].content.strip()
                    tr.save()

        # update aggregations after save of last inline form
        if formset.model == TransactionReceiver:
            try:
                if formset.instance.receiver_organisation.id is None:
                    formset.instance.receiver_organisation.save()
            except ObjectDoesNotExist:
                pass

            aggregation_calculator = ActivityAggregationCalculation()
            aggregation_calculator.parse_activity_aggregations(
                form.instance.activity)

    def save_related(self, request, form, formsets, change):
        super(TransactionAdmin, self).save_related(request, form, formsets,
                                                   change)

        # remove old
        TransactionSector.objects.filter(
            transaction__activity=self.act).delete()
        TransactionRecipientCountry.objects.filter(
            transaction__activity=self.act).delete()
        TransactionRecipientRegion.objects.filter(
            transaction__activity=self.act).delete()

        # add new
        post_save.set_transaction_provider_receiver_activity(self.act)
        post_save.set_activity_aggregations(self.act)
        post_save.set_country_region_transaction(self.act)
        post_save.set_sector_transaction(self.act)
Пример #21
0
class ResultAdmin(nested_admin.NestedAdmin):
    search_fields = ['activity__id']
    readonly_fields = ['activity']
    list_display = ['__unicode__']
    inlines = [
        ResultTitleInline,
        ResultDescriptionInline,
        ResultIndicatorInline,
    ]

    form = autocomplete_forms.modelform_factory(Result, fields='__all__')

    def get_inline_instances(self, request, obj=None):
        if obj is None:
            return []

        inline_instances = super(ResultAdmin,
                                 self).get_inline_instances(request, obj)

        return inline_instances

    def get_object(self, request, object_id, from_field=None):
        obj = super(ResultAdmin, self).get_object(request, object_id)

        if not obj.resultindicator_set.count():
            result_indicator = ResultIndicator()
            result_indicator.result = obj
            result_indicator.save()

        for result_indicator in obj.resultindicator_set.all():
            if not getattr(result_indicator, 'resultindicatortitle', None):
                title = ResultIndicatorTitle()
                title.result_indicator = result_indicator
                title.save()
                result_indicator.resultindicatortitle = title

        return obj

    def save_model(self, request, obj, form, change):
        super(ResultAdmin, self).save_model(request, obj, form, change)
        self.act = obj.activity

    def save_formset(self, request, form, formset, change):
        if formset.model == Narrative:
            for entry in formset.cleaned_data:
                if entry and entry['id'] is None:
                    entry['activity'] = self.act
        super(ResultAdmin, self).save_formset(request, form, formset, change)

        if formset.model == ResultTitle:
            try:
                if formset.instance.resulttitle.id is None:
                    formset.instance.resulttitle.save()
            except ObjectDoesNotExist:
                pass

        if formset.model == ResultDescription:
            try:
                if formset.instance.resultdescription.id is None:
                    formset.instance.resultdescription.save()
            except ObjectDoesNotExist:
                pass

        if formset.model == ResultIndicatorPeriodActualComment:
            try:
                if formset.instance.resultindicatorperiodactualcomment.id is None:
                    if formset.instance.resultindicatorperiodactualcomment.result_indicator_period_id is None:
                        formset.instance.resultindicatorperiodactualcomment.result_indicator_period_id = formset.instance.resultindicatorperiodactualcomment.result_indicator_period.id
                    formset.instance.resultindicatorperiodactualcomment.save()
            except ObjectDoesNotExist:
                pass

        if formset.model == ResultIndicatorPeriodTargetComment:
            try:
                if formset.instance.resultindicatorperiodtargetcomment.id is None:
                    if formset.instance.resultindicatorperiodtargetcomment.result_indicator_period_id is None:
                        formset.instance.resultindicatorperiodtargetcomment.result_indicator_period_id = formset.instance.resultindicatorperiodtargetcomment.result_indicator_period.id
                    formset.instance.resultindicatorperiodtargetcomment.save()
            except ObjectDoesNotExist:
                pass

        # save primary name on result indicator title to make aggregations work
        if isinstance(formset.instance, ResultIndicatorTitle):
            if formset.cleaned_data[0]:
                rit = formset.instance
                if rit.narratives.all().count() > 0:
                    rit.primary_name = rit.narratives.all()[0].content.strip()
                    rit.save()

        if formset.model == ResultIndicatorDescription:
            try:
                if formset.instance.resultindicatordescription.id is None:
                    if formset.instance.id is None:
                        formset.instance.save()
                        formset.instance.resultindicatordescription.result_indicator = formset.instance
                    formset.instance.resultindicatordescription.save()
            except ObjectDoesNotExist:
                pass
Пример #22
0
class OwnerAdmin(BaseOwnerAdmin):
    # NB: setting fields = '__all__', less concerned about security since we
    # are in the admin site
    form = modelform_factory(Owner, fields='__all__')
Пример #23
0
class LinkInline(admin.TabularInline):
    form = modelform_factory(InlineLink, exclude=())
    model = InlineLink
    fk_name = 'parent_story'
    extra = 0