diff --git a/sample/sample_views/stool_sample_views.py b/sample/sample_views/stool_sample_views.py index 26c7838..e545be8 100644 --- a/sample/sample_views/stool_sample_views.py +++ b/sample/sample_views/stool_sample_views.py @@ -13,6 +13,7 @@ CreateBreadcrumbMixin, DetailBreadcrumbMixin, ) +from django.core.exceptions import PermissionDenied from address.forms import AddressForm from sample.const import IMAGE_COUNT, IMAGE_TYPE_CHOICES, SLIDE_COUNT @@ -71,9 +72,15 @@ def get_queryset(self, **kwargs): today_date = datetime.datetime.today().strftime('%Y-%m-%d') self.end_date = self.request.GET.get('to', today_date) queryset = queryset.filter(date_of_collection__range=[self.start_date, self.end_date]) - self.province = self.request.GET.get('province', '') + + self.province = self.request.GET.get('province', "") + user_provinces = self.request.user.profile.provinces.all() if self.province: + if not user_provinces.filter(id=self.province): + raise PermissionDenied(f"No permission to view items from Province {self.province}") queryset = queryset.filter(site__district__province__id=self.province) + else: + queryset = queryset.filter(site__district__province__id__in=user_provinces) return queryset diff --git a/sample/templates/sample/sample_home.html b/sample/templates/sample/sample_home.html index 656861f..2e2e5d8 100644 --- a/sample/templates/sample/sample_home.html +++ b/sample/templates/sample/sample_home.html @@ -21,22 +21,26 @@ {% with detail_url_name="sample:"|add:sample_type|add:"_detail" %}

{{ sample_type|title }} Samples

-
- {% with list_url="sample:"|add:sample_type|add:"_list" %} -
- {% endwith %} -
-
- -
-
- {{ filter_form }} -
-
- +
+
+

+ +

+
+
+ {% with list_url="sample:"|add:sample_type|add:"_list" %} + + {% endwith %} + {{ filter_form }} + +
- +
@@ -120,4 +124,4 @@
No samples to show.
{% endwith %} {% endwith %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/user/admin.py b/user/admin.py new file mode 100644 index 0000000..b5ed08a --- /dev/null +++ b/user/admin.py @@ -0,0 +1,27 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.models import User + +from user.models import Profile + + +class ProfileInline(admin.StackedInline): + model = Profile + can_delete = False + verbose_name_plural = 'Profile' + fk_name = 'user' + + +class CustomUserAdmin(UserAdmin): + inlines = (ProfileInline, ) + + def get_inline_instances(self, request, obj=None): + if not obj: + return list() + return super(CustomUserAdmin, self).get_inline_instances(request, obj) + + +# Register your models here. +admin.site.register(Profile) +admin.site.unregister(User) +admin.site.register(User, CustomUserAdmin) diff --git a/user/migrations/0001_initial.py b/user/migrations/0001_initial.py new file mode 100644 index 0000000..301a3cf --- /dev/null +++ b/user/migrations/0001_initial.py @@ -0,0 +1,40 @@ +# Generated by Django 4.1.3 on 2023-10-09 16:56 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("address", "0003_province_code"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Profile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("provinces", models.ManyToManyField(to="address.province")), + ( + "user", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + ] diff --git a/user/migrations/0002_alter_profile_provinces.py b/user/migrations/0002_alter_profile_provinces.py new file mode 100644 index 0000000..5289060 --- /dev/null +++ b/user/migrations/0002_alter_profile_provinces.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.3 on 2023-10-09 17:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("address", "0003_province_code"), + ("user", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="profile", + name="provinces", + field=models.ManyToManyField(blank=True, to="address.province"), + ), + ] diff --git a/user/migrations/__init__.py b/user/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/user/models.py b/user/models.py new file mode 100644 index 0000000..0cabdad --- /dev/null +++ b/user/models.py @@ -0,0 +1,24 @@ +from django.db import models +from django.contrib.auth.models import User +from address.models import Province +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.core.exceptions import ObjectDoesNotExist + + +class Profile(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + provinces = models.ManyToManyField(Province, blank=True) + + +@receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + try: + instance.profile.save() + except ObjectDoesNotExist: + Profile.objects.create(user=instance) + + +@receiver(post_save, sender=User) +def save_user_profile(sender, instance, **kwargs): + instance.profile.save()