umap/umap/admin.py

101 lines
2.6 KiB
Python

import csv
from datetime import datetime
from django.contrib.auth.admin import UserAdmin as UserAdminBase
from django.contrib.auth.models import User
from django.contrib.gis import admin
from django.http import HttpResponse
from django.utils.translation import gettext_lazy as _
from .models import DataLayer, Licence, Map, Pictogram, Team, TileLayer
class CSVExportMixin:
actions = ["as_csv"]
@admin.action(description=_("CSV Export"))
def as_csv(self, request, queryset):
modelname = queryset.model.__name__.lower()
filename = f"umap_{modelname}_{datetime.now().isoformat()}.csv"
response = HttpResponse(
content_type="text/csv",
headers={"Content-Disposition": f'attachment; filename="{filename}"'},
)
def get_cell(user, field):
if hasattr(self, field):
return getattr(self, field)(user)
return getattr(user, field)
writer = csv.writer(response)
writer.writerow(self.csv_fields)
for user in queryset:
writer.writerow(get_cell(user, field) for field in self.csv_fields)
return response
class TileLayerAdmin(admin.ModelAdmin):
list_display = (
"name",
"rank",
)
list_editable = ("rank",)
class MapAdmin(CSVExportMixin, admin.GISModelAdmin):
search_fields = ("name",)
autocomplete_fields = ("owner", "editors")
list_filter = ("share_status",)
csv_fields = (
"pk",
"name",
"center",
"zoom",
"created_at",
"modified_at",
"edit_status",
"share_status",
"owner_id",
"team_id",
)
class PictogramAdmin(admin.ModelAdmin):
list_display = (
"name",
"category",
)
list_editable = ("category",)
list_filter = ("category",)
class TeamAdmin(admin.ModelAdmin):
filter_horizontal = ("users",)
class UserAdmin(CSVExportMixin, UserAdminBase):
csv_fields = [
"pk",
"username",
"email",
"first_name",
"last_name",
"last_login",
"date_joined",
"maps_count",
]
list_display = list(UserAdminBase.list_display) + ["maps_count"]
def maps_count(self, obj):
# owner maps + maps as editor
return obj.owned_maps.count() + obj.map_set.count()
admin.site.register(Map, MapAdmin)
admin.site.register(DataLayer)
admin.site.register(Pictogram, PictogramAdmin)
admin.site.register(TileLayer, TileLayerAdmin)
admin.site.register(Licence)
admin.site.register(Team, TeamAdmin)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)