class LocationAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Location)
class SupporterAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Supporter)
class MyUserAdmin(admin.ModelAdmin): form = autocomplete_form_factory(User) search_fields = ('id', 'username', 'emailaddress__email', 'profile__display_name')
class DeviceAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Device)
class VideoAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Video)
class DatingConfirmationAdmin(ModelAdmin): form = autocomplete_form_factory(DatingConfirmation)
class FaceRecognitionRectangleAdmin(admin.ModelAdmin): form = autocomplete_form_factory(FaceRecognitionRectangle)
class SourceAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Source) search_fields = ('id', 'name', 'description')
class AlbumPhotoAdmin(admin.ModelAdmin): form = autocomplete_form_factory(AlbumPhoto)
class PointsAdmin(ModelAdmin): form = autocomplete_form_factory(Points)
class AlbumAdmin(ModelAdmin): form = autocomplete_form_factory(Album) search_fields = ('id', 'name_et', 'name_lv', 'name_lt', 'name_fi', 'name_sv', 'name_nl', 'name_de', 'name_ru', 'name_en', 'description', 'slug')
class ProfileAdmin(ModelAdmin): form = autocomplete_form_factory(Profile) search_fields = ('user__id', 'display_name', 'first_name', 'last_name', 'fb_name', 'google_plus_name')
class GeoTagAdmin(ModelAdmin): form = autocomplete_form_factory(GeoTag)
class SkipAdmin(ModelAdmin): form = autocomplete_form_factory(Skip)
class ApplicationExceptionAdmin(admin.ModelAdmin): form = autocomplete_form_factory(ApplicationException)
class AreaAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Area)
class DatingAdmin(ModelAdmin): form = autocomplete_form_factory(Dating)
class LicenceAdmin(admin.ModelAdmin): form = autocomplete_form_factory(Licence) search_fields = ('id', 'name')
class PhotoAdmin(ModelAdmin): @staticmethod def _distance_between_two_points_on_sphere(lon_1, lat_1, lon_2, lat_2): import math rad = math.pi / 180.0 equatorial_radius_meters = 6378137 lon_1_rad = lon_1 * rad lat_1_rad = lat_1 * rad lon_2_rad = lon_2 * rad lat_2_rad = lat_2 * rad cos_angle = math.sin(lat_1_rad) * math.sin(lat_2_rad) + math.cos( lat_1_rad) * math.cos(lat_2_rad) * math.cos(lon_2_rad - lon_1_rad) if cos_angle >= 1: return 0 angle = math.acos(cos_angle) return angle * equatorial_radius_meters def save_model(self, request, obj, form, change): if obj.lat and obj.lon and obj.bounding_circle_radius: # If an administrator sets a bounding circle, invalidate GeoTags outside of it all_photo_geo_tags = GeoTag.objects.filter(photo_id=obj.id) for geo_tag in all_photo_geo_tags: d = self._distance_between_two_points_on_sphere( obj.lon, obj.lat, geo_tag.lon, geo_tag.lat) if d > obj.bounding_circle_radius: geo_tag.is_correct = False else: geo_tag.is_correct = True geo_tag.save() obj.save() def _invertcolors(self, id): from django.http.response import HttpResponse photo = Photo.objects.filter(pk=id.split('/')[0]).first() if photo: photo_path = settings.MEDIA_ROOT + '/' + str(photo.image) img = Image.open(photo_path) inverted_grayscale_image = ImageOps.invert(img).convert('L') inverted_grayscale_image.save(photo_path) photo.invert = not photo.invert sorl_delete(photo.image, delete_file=False) photo.light_save() return HttpResponse(u'Photo inverted!') return HttpResponse(u'Failed to invert photo!') extra_buttons = [ { 'url': '_invertcolors', 'textname': _('Invert colors'), 'func': _invertcolors }, ] def change_view(self, request, object_id, form_url='', extra_context={}): extra_context['extra_buttons'] = self.extra_buttons return super(PhotoAdmin, self).change_view(request, object_id, form_url, extra_context=extra_context) def get_urls(self): from django.conf.urls import url urls = super(PhotoAdmin, self).get_urls() my_urls = list((url(r'^(.+)/%(url)s/$' % b, self.admin_site.admin_view(b['func'])) for b in self.extra_buttons)) return my_urls + urls inlines = (AlbumPhotoInline, ) form = autocomplete_form_factory(Photo) search_fields = ('id', 'description_et', 'description_lv', 'description_lt', 'description_fi', 'description_sv', 'description_nl', 'description_de', 'description_ru', 'description_en', 'title_et', 'title_lv', 'title_lt', 'title_fi', 'title_sv', 'title_nl', 'title_de', 'title_ru', 'title_en', 'author', 'types', 'keywords', 'source__name', 'source_key', 'address', 'muis_title', 'muis_comment', 'muis_event_description_set_note', 'muis_text_on_object', 'muis_legends_and_descriptions')
class FaceRecognitionUserSuggestionAdmin(admin.ModelAdmin): form = autocomplete_form_factory(FaceRecognitionUserSuggestion)