Skip to content

Commit

Permalink
Brug af adresse objekter for aktiviteter
Browse files Browse the repository at this point in the history
Admin > Aktivitet:
Brug addresse objekt.
Vis region fra addresse objekt.
Addresse- og Afdelings-søgefelter er ændret til auto-complete med søgefunktion/filter
Ændrede hjælpetekster for Afdeling, Aktivitet, Lokation og tilmeldingsdetaljer.

Admin > Adresse:
Liste med addresser:
Tilføjede Regions filter
Tilføjede kolonner med detaljer for addreserne.
Tilføjede søgefunktion
Adresseobjekter:
Tilføje Inlines så man kan se hvor en adresse bliver brugt (i Foreninger, Afdelinger og Aktiviteter).
Fjernede titler for Inlines.

Admin > Afdelinger:
Tilføjede sortering efter navn for at auto-complete under aktiviteter ser fornuftig ud.

Address Class:
Tilføjede regon "Online".
Tilføjede dawa_category, samt at dette felt bliver opdateret med info fra DAWA.

Opdaterede get_user_address for at vise de adresser en user har adgang til (via forening, afdelnger og aktiviteter for afdelinger).

Activities.html, activity_signup.html, membership.hmtl og Activities.py:
Opdaterede til at bruge adresse objekt fra aktiviteten.

Command activity_address_migration.py:
Migrering af aktiviteter uden adresse objekt, så der oprettes addresse objekter baseret på afdelingens adresse innformation via opslag i DAWA
  • Loading branch information
mhewel committed Mar 29, 2024
1 parent 9a3936b commit a79b085
Show file tree
Hide file tree
Showing 10 changed files with 367 additions and 76 deletions.
65 changes: 40 additions & 25 deletions members/admin/activity_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
AdminUserInformation,
Department,
Union,
Address,
)


Expand Down Expand Up @@ -99,7 +100,7 @@ class ActivityAdmin(admin.ModelAdmin):
"department__name",
"description",
)
readonly_fields = ("seats_left", "participants")
readonly_fields = ("seats_left", "participants", "addressregion")
list_per_page = 20
raw_id_fields = (
"union",
Expand All @@ -110,6 +111,11 @@ class ActivityAdmin(admin.ModelAdmin):
ActivityDepartmentListFilter,
"open_invite",
"activitytype",
"address__region",
)
autocomplete_fields = (
"address",
"department",
)
save_as = True

Expand Down Expand Up @@ -164,6 +170,11 @@ def seats_free(self, obj):

seats_free.short_description = "Ubesat"

def addressregion(self, obj):
return str(obj.address.region)

addressregion.short_description = "Region"

def activity_membership_union_link(self, obj):
if obj.activitytype_id in ["FORENINGSMEDLEMSKAB", "STØTTEMEDLEMSKAB"]:
url = reverse("admin:members_union_change", args=[obj.union_id])
Expand All @@ -182,28 +193,33 @@ def get_queryset(self, request):
departments = Department.objects.filter(adminuserinformation__user=request.user)
return qs.filter(department__in=departments)

# Only show own departments when creating new activity
# Solution found on https://stackoverflow.com/questions/57056994/django-model-form-with-only-view-permission-puts-all-fields-on-exclude
# formfield_for_foreignkey described in documentation here: https://docs.djangoproject.com/en/4.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey
def formfield_for_foreignkey(self, db_field, request, **kwargs):
# Only show own departments when creating new activity
if db_field.name == "department" and not request.user.is_superuser:
kwargs["queryset"] = Department.objects.filter(
adminuserinformation__user=request.user
)
return super(ActivityAdmin, self).formfield_for_foreignkey(
db_field, request, **kwargs
)
if db_field.name == "address":
kwargs["queryset"] = Address.get_user_addresses(request.user)
return super().formfield_for_foreignkey(db_field, request, **kwargs)

fieldsets = [
(
"Afdeling",
{
"description": "<p>Du kan ændre afdeling for aktiviteten ved at skrive afdelings-id, eller tryk på søg-ikonet og i det nye vindue skal du finde afdelingen, for derefter at trykke på ID i første kolonne.</p>",
"description": "<p>Du kan ændre afdeling for aktiviteten ved at vælge en afdeling i listen, evt bruge søgefunktionen.</p>",
"fields": ("department",),
},
),
(
"Aktivitet",
{
"description": "<p>Aktivitetsnavnet skal afspejle aktivitet samt tidspunkt. F.eks. <em>Forårssæson 2018</em>.</p><p>Tidspunkt er f.eks. <em>Onsdage 17:00-19:00</em></p>",
"description": """<p>Aktivitetsnavnet skal afspejle aktivitet samt tidspunkt.
F.eks. <em>Forårssæson 2018</em>.</p>
<p>Tidspunkt er f.eks. <em>Onsdage 17:00-19:00</em></p>
<p>Startdato er første dag for aktiviteten, og slutdato er sidste for aktiviteten</p>""",
"fields": (
(
"name",
Expand All @@ -222,31 +238,30 @@ def formfield_for_foreignkey(self, db_field, request, **kwargs):
(
"Lokation og ansvarlig",
{
"description": "<p>Adresse samt ansvarlig kan adskille sig fra afdelingens informationer (f.eks. et gamejam der foregår et andet sted).</p>",
"description": """<p>Adresse samt ansvarlig kan adskille sig fra afdelingens
informationer (f.eks. et gamejam der kan foregå et andet sted).</p>""",
"fields": (
(
"responsible_name",
"responsible_contact",
),
(
"streetname",
"housenumber",
"floor",
"door",
),
(
"zipcode",
"city",
"placename",
),
("address",),
"address",
"addressregion",
"responsible_name",
"responsible_contact",
),
},
),
(
"Tilmeldingsdetaljer",
{
"description": '<p>Tilmeldingsinstruktioner er tekst der kommer til at stå på betalingsformularen på tilmeldingssiden. Den skal bruges til at stille spørgsmål, som den, der tilmelder sig, kan besvare ved tilmelding.</p><p>Fri tilmelding betyder, at alle, når som helst kan tilmelde sig denne aktivitet - efter "først til mølle"-princippet. Dette er kun til aktiviteter og klubaften-forløb/sæsoner i områder, hvor der ikke er nogen venteliste. </p><p>Alle aktiviteter med fri tilmelding kommer til at stå med en stor "tilmeld" knap på medlemssiden. <b>Vi bruger typisk ikke fri tilmelding - spørg i Slack hvis du er i tvivl!</b></p>',
"description": """<p>Tilmeldingsinstruktioner er tekst der kommer til at stå på
betalingsformularen på tilmeldingssiden.</p>
<p>Den skal bruges til at stille spørgsmål, som den, der tilmelder sig,
kan besvare ved tilmelding.</p>
<p>Fri tilmelding betyder, at alle, når som helst kan tilmelde sig denne
aktivitet - efter "først til mølle"-princippet.
Dette er kun til aktiviteter og klubaften-forløb/sæsoner i områder,
hvor der ikke er nogen venteliste. </p>
<p>Alle aktiviteter med fri tilmelding kommer til at stå med en stor "tilmeld"
knap på medlemssiden. <b>Afdelinger med venteliste bruger typisk ikke fri
tilmelding - spørg i Slack hvis du er i tvivl!</b></p>""",
"fields": (
"instructions",
(
Expand Down
161 changes: 152 additions & 9 deletions members/admin/address_admin.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,135 @@
from django.contrib import admin
from members.models import Address

from members.models import (
Union,
Department,
Activity,
)


class AddressUnionInline(admin.TabularInline):
# Tabular Inline list of Unions using this address object. Read Only
model = Union
extra = 0
fields = ("name",)
readonly_fields = fields
can_delete = False

def get_queryset(self, request):
return Union.objects.all().order_by("name")

def has_add_permission(self, request, obj=None):
return False


class AddressDepartmentInline(admin.TabularInline):
# Tabular Inline list of Departments using this address object. Read Only
model = Department
extra = 0
fields = ("name",)
readonly_fields = fields
can_delete = False

def get_queryset(self, request):
return Department.objects.all().order_by("name")

def has_add_permission(self, request, obj=None):
return False


class AddressActivityInline(admin.TabularInline):
# Tabular Inline list of Activities using this address object. Read Only
model = Activity
extra = 0
fields = (
"name",
"start_date",
"end_date",
"department",
)
readonly_fields = fields
can_delete = False

def get_queryset(self, request):
return Activity.objects.all().order_by("name")

def has_add_permission(self, request, obj=None):
return False


class AddressRegionListFilter(admin.SimpleListFilter):
# List filter on region values
title = "Regioner"
parameter_name = "region"

def lookups(self, request, model_admin):
regionList = [("none", "(ingen region)")]
lastRegion = ""
for aRegion in Address.objects.all().order_by("region"):
if aRegion.region != lastRegion:
lastRegion = aRegion.region
regionList += (
(
str(aRegion.region),
str(aRegion.region),
),
)
return regionList

def queryset(self, request, queryset):
region_id = request.GET.get(self.parameter_name, None)
if region_id == "none":
return queryset.filter(region="")
if region_id:
return queryset.filter(region=region_id)
return queryset


class AddressAdmin(admin.ModelAdmin):
readonly_fields = (
"created_at",
"created_by",
)

search_fields = (
"id",
"streetname",
"housenumber",
"floor",
"door",
"placename",
"zipcode",
"city",
"region",
"descriptiontext",
"dawa_id",
)

list_display = (
"id",
"streetname",
"housenumber",
"floor",
"door",
"placename",
"zipcode",
"city",
"region",
"descriptiontext",
"dawa_id",
"dawa_category",
)

class Media:
# Remove title for each record
# see : https://stackoverflow.com/questions/41376406/remove-title-from-tabularinline-in-admin
css = {"all": ("members/css/custom_admin.css",)} # Include extra css

inlines = [AddressUnionInline, AddressDepartmentInline, AddressActivityInline]

list_filter = (AddressRegionListFilter,)

def get_queryset(self, request):
return Address.get_user_addresses(request.user)

Expand All @@ -16,23 +138,44 @@ def get_queryset(self, request):
"Adresse",
{
"fields": (
"streetname",
"housenumber",
"floor",
"door",
(
"streetname",
"housenumber",
),
(
"floor",
"door",
),
"placename",
"zipcode",
"city",
"municipality",
"region",
(
"zipcode",
"city",
),
(
"municipality",
"region",
),
"descriptiontext",
)
},
),
(
"Dawa info",
{
"fields": ("dawa_id", "dawa_overwrite", "longitude", "latitude"),
"description": """
<p>ID, ategori, længde- og breddegrad fra Dawa.</p>
<p>Du kan vælge at sætte egne værdier for længde- og breddegrad.</p>""",
"fields": (
(
"dawa_id",
"dawa_category",
),
"dawa_overwrite",
(
"longitude",
"latitude",
),
),
"classes": ("collapse",),
},
),
Expand Down
1 change: 1 addition & 0 deletions members/admin/department_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class DepartmentAdmin(admin.ModelAdmin):
"address__zipcode",
"address__city",
)
ordering = ["name"]
filter_horizontal = ["department_leaders"]

# Solution found on https://stackoverflow.com/questions/57056994/django-model-form-with-only-view-permission-puts-all-fields-on-exclude
Expand Down
Loading

0 comments on commit a79b085

Please sign in to comment.