diff options
Diffstat (limited to 'ishtar_common/admin.py')
-rw-r--r-- | ishtar_common/admin.py | 94 |
1 files changed, 88 insertions, 6 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index cec61a51e..2df910ffd 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -20,11 +20,14 @@ import csv from ajax_select import make_ajax_form +from ajax_select.fields import AutoCompleteSelectField, \ + AutoCompleteSelectMultipleField from django.conf import settings from django.contrib import admin from django.contrib.auth.admin import GroupAdmin, UserAdmin from django.contrib.auth.models import Group, User +from django.contrib.contenttypes.models import ContentType from django.contrib.sites.admin import SiteAdmin from django.contrib.sites.models import Site from django.contrib.gis.forms import PointField, OSMWidget @@ -114,12 +117,22 @@ def export_as_csv_action(description=_(u"Export selected as CSV file"), class HistorizedObjectAdmin(admin.ModelAdmin): - readonly_fields = ['history_creator', 'history_modifier',] + readonly_fields = ['history_creator', 'history_modifier', 'search_vector'] def save_model(self, request, obj, form, change): obj.history_modifier = request.user obj.save() + def get_readonly_fields(self, request, obj=None): + if obj: # editing an existing object + return tuple(self.readonly_fields or []) + tuple(['imports']) + return self.readonly_fields + + def get_exclude(self, request, obj=None): + if not obj: + return tuple(self.exclude or []) + tuple(['imports']) + return self.exclude + class MyGroupAdmin(GroupAdmin): class Media: @@ -153,7 +166,6 @@ class OrganizationAdmin(HistorizedObjectAdmin): list_filter = ("organization_type",) search_fields = ('name',) exclude = ('merge_key', 'merge_exclusion', 'merge_candidate', ) - readonly_fields = HistorizedObjectAdmin.readonly_fields + ['imports'] model = models.Organization admin_site.register(models.Organization, OrganizationAdmin) @@ -164,31 +176,51 @@ class PersonAdmin(HistorizedObjectAdmin): list_filter = ("person_types",) search_fields = ('name', 'surname', 'email', 'raw_name') exclude = ('merge_key', 'merge_exclusion', 'merge_candidate', ) - readonly_fields = HistorizedObjectAdmin.readonly_fields + ['imports'] form = make_ajax_form(models.Person, {'attached_to': 'organization'}) model = models.Person admin_site.register(models.Person, PersonAdmin) +class AdminRelatedTownForm(forms.ModelForm): + class Meta: + model = models.Town.children.through + exclude = [] + from_town = AutoCompleteSelectField( + 'town', required=True, label=_(u"Parent")) + + class AdminTownForm(forms.ModelForm): class Meta: model = models.Town - exclude = [] + exclude = ['imports'] center = PointField(label=_(u"center"), required=False, widget=OSMWidget) + children = AutoCompleteSelectMultipleField('town', required=False, + label=_(u"Town children")) + + +class TownParentInline(admin.TabularInline): + model = models.Town.children.through + fk_name = 'to_town' + form = AdminRelatedTownForm + verbose_name = _(u"Parent") + verbose_name_plural = _(u"Parents") + extra = 1 class TownAdmin(admin.ModelAdmin): + model = models.Town list_display = ['name', ] search_fields = ['name'] + readonly_fields = ['cached_label'] if settings.COUNTRY == 'fr': list_display += ['numero_insee', 'departement', ] search_fields += ['numero_insee', 'departement__label', ] list_filter = ("departement",) - readonly_fields = ['imports'] - model = models.Town form = AdminTownForm + inlines = [TownParentInline] + admin_site.register(models.Town, TownAdmin) @@ -333,6 +365,56 @@ class ItemKeyAdmin(admin.ModelAdmin): admin_site.register(models.ItemKey, ItemKeyAdmin) +class JsonContentTypeFormMixin(object): + class Meta: + model = models.JsonDataSection + exclude = [] + + def __init__(self, *args, **kwargs): + super(JsonContentTypeFormMixin, self).__init__(*args, **kwargs) + choices = [] + for pk, label in self.fields['content_type'].choices: + if not pk: + choices.append((pk, label)) + continue + ct = ContentType.objects.get(pk=pk) + model_class = ct.model_class() + if hasattr(model_class, 'data') and \ + not hasattr(model_class, 'history_type'): + choices.append((pk, label)) + self.fields['content_type'].choices = sorted(choices, + key=lambda x: x[1]) + + +class JsonDataSectionForm(JsonContentTypeFormMixin, forms.ModelForm): + class Meta: + model = models.JsonDataSection + exclude = [] + + +class JsonDataSectionAdmin(admin.ModelAdmin): + list_display = ['name', 'content_type', 'order'] + form = JsonDataSectionForm + + +admin_site.register(models.JsonDataSection, JsonDataSectionAdmin) + + +class JsonDataFieldForm(JsonContentTypeFormMixin, forms.ModelForm): + class Meta: + model = models.JsonDataField + exclude = [] + + +class JsonDataFieldAdmin(admin.ModelAdmin): + list_display = ['name', 'content_type', 'key', 'display', + 'order', 'section'] + form = JsonDataFieldForm + + +admin_site.register(models.JsonDataField, JsonDataFieldAdmin) + + class AdministrationScriptAdmin(admin.ModelAdmin): list_display = ['name', 'path'] |