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
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__')
class ActivitySectorInline(nested_admin.NestedStackedInline): model = ActivitySector classes = ('collapse open', ) inline_classes = ('collapse open', ) extra = 6 form = autocomplete_forms.modelform_factory(Sector, fields='__all__')
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', )
class ActivityRecipientCountryInline(nested_admin.NestedStackedInline): model = ActivityRecipientCountry classes = ('collapse open', ) inline_classes = ('collapse open', ) extra = 6 form = autocomplete_forms.modelform_factory(ActivityRecipientCountry, fields='__all__')
class MapLayerAdmin(admin.ModelAdmin): list_display = ('id', 'map', 'name') list_filter = ('map', ) search_fields = ( 'map__title', 'name', ) form = modelform_factory(MapLayer, fields='__all__')
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__')
class FrontpageStoryInline(SmallTextArea, admin.TabularInline, ThumbAdmin): form = modelform_factory(FrontpageStory, exclude=()) model = FrontpageStory fields = ( 'headline', 'kicker', 'lede', 'imagefile', 'thumbnail', ), readonly_fields = ('thumbnail', ) extra = 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', )
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;'}) }, }
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', )
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', )
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
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', )
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)
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, ]
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)
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)
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__')
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)
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
class OwnerAdmin(BaseOwnerAdmin): # NB: setting fields = '__all__', less concerned about security since we # are in the admin site form = modelform_factory(Owner, fields='__all__')
class LinkInline(admin.TabularInline): form = modelform_factory(InlineLink, exclude=()) model = InlineLink fk_name = 'parent_story' extra = 0