diff --git a/src/shiftings/cal/migrations/0001_initial.py b/src/shiftings/cal/migrations/0001_initial.py new file mode 100644 index 0000000..9e4bc31 --- /dev/null +++ b/src/shiftings/cal/migrations/0001_initial.py @@ -0,0 +1,32 @@ +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('organizations', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='CalendarFilter', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('hide_public_shifts', models.BooleanField(default=False)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, + related_name='calendar_filter', + to=settings.AUTH_USER_MODEL)), + ('hidden_public_organizations', models.ManyToManyField(blank=True, + related_name='hidden_calendar_filters', + to='organizations.organization')), + ], + options={ + 'default_permissions': (), + }, + ), + ] diff --git a/src/shiftings/cal/migrations/__init__.py b/src/shiftings/cal/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/shiftings/cal/models/__init__.py b/src/shiftings/cal/models/__init__.py new file mode 100644 index 0000000..434e4b8 --- /dev/null +++ b/src/shiftings/cal/models/__init__.py @@ -0,0 +1,3 @@ +from shiftings.cal.models.filter import CalendarFilter + +__all__ = ['CalendarFilter'] diff --git a/src/shiftings/cal/models/filter.py b/src/shiftings/cal/models/filter.py new file mode 100644 index 0000000..39a44b0 --- /dev/null +++ b/src/shiftings/cal/models/filter.py @@ -0,0 +1,13 @@ +from django.db import models + + +class CalendarFilter(models.Model): + user = models.OneToOneField('accounts.User', on_delete=models.CASCADE, + related_name='calendar_filter') + hide_public_shifts = models.BooleanField(default=False) + hidden_public_organizations = models.ManyToManyField( + 'organizations.Organization', blank=True, + related_name='hidden_calendar_filters') + + class Meta: + default_permissions = () diff --git a/src/shiftings/shifts/forms/filters.py b/src/shiftings/shifts/forms/filters.py index 5454832..d48e5f4 100644 --- a/src/shiftings/shifts/forms/filters.py +++ b/src/shiftings/shifts/forms/filters.py @@ -1,4 +1,5 @@ from django import forms +from django.contrib.contenttypes.models import ContentType from django.forms import BooleanField, CheckboxSelectMultiple, ModelMultipleChoiceField, TimeField from django.utils.translation import gettext_lazy as _ @@ -18,6 +19,9 @@ class ShiftFilterForm(forms.Form): start_after_time_field = TimeField(label=_('Time HH:MM'), required=False) end_before_field = DateFormField(label=_('Date YYYY-MM-DD'), required=False) end_before_time_field = TimeField(label=_('Time HH:MM'), required=False) + hide_public_shifts = BooleanField(widget=forms.CheckboxInput, label=_('Hide public shifts'), required=False) + exclude_public_orgs_field = ModelMultipleChoiceField(queryset=Organization.objects.none(), + widget=CheckboxSelectMultiple, required=False) def __init__(self, user: User, *args, **kwargs): super().__init__(*args, **kwargs) @@ -28,3 +32,16 @@ def __init__(self, user: User, *args, **kwargs): self.fields['select_event_field'].queryset = events self.has_events = events.count() > 0 + from shiftings.shifts.models import Shift + from shiftings.shifts.models.permission import ParticipationPermission, ParticipationPermissionType + shift_ct = ContentType.objects.get_for_model(Shift) + public_shift_ids = ParticipationPermission.objects.filter( + referred_content_type=shift_ct, + permission_type_field__gte=ParticipationPermissionType.Existence, + organization__isnull=True + ).values_list('referred_object_id', flat=True) + public_orgs = Organization.objects.filter( + shifts__id__in=public_shift_ids + ).exclude(id__in=orgs.values('id')).distinct() + self.fields['exclude_public_orgs_field'].queryset = public_orgs + self.has_public_orgs = public_orgs.exists() diff --git a/src/shiftings/shifts/migrations/0007_alter_recurringshift_color_alter_shifttype_color.py b/src/shiftings/shifts/migrations/0007_alter_recurringshift_color_alter_shifttype_color.py new file mode 100644 index 0000000..bf37572 --- /dev/null +++ b/src/shiftings/shifts/migrations/0007_alter_recurringshift_color_alter_shifttype_color.py @@ -0,0 +1,24 @@ +# Generated by Django 6.0.2 on 2026-03-15 14:17 + +import colorfield.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('shifts', '0006_recurringshift_auto_create_days'), + ] + + operations = [ + migrations.AlterField( + model_name='recurringshift', + name='color', + field=colorfield.fields.ColorField(default='#FD7E14', image_field=None, max_length=25, samples=[('#0D6EFD', 'Blue'), ('#6610F2', 'Indigo'), ('#6F42C1', 'Purple'), ('#D63384', 'Pink'), ('#DC3545', 'Red'), ('#FD7E14', 'Orange'), ('#FFC107', 'Yellow'), ('#198754', 'Green'), ('#20C997', 'Teal'), ('#0DCAF0', 'Cyan')]), + ), + migrations.AlterField( + model_name='shifttype', + name='color', + field=colorfield.fields.ColorField(default='#FD7E14', image_field=None, max_length=25, samples=[('#0D6EFD', 'Blue'), ('#6610F2', 'Indigo'), ('#6F42C1', 'Purple'), ('#D63384', 'Pink'), ('#DC3545', 'Red'), ('#FD7E14', 'Orange'), ('#FFC107', 'Yellow'), ('#198754', 'Green'), ('#20C997', 'Teal'), ('#0DCAF0', 'Cyan')]), + ), + ] diff --git a/src/shiftings/shifts/templates/shifts/template/shift_url_filter_form.html b/src/shiftings/shifts/templates/shifts/template/shift_url_filter_form.html index d0f33c5..035d2c8 100644 --- a/src/shiftings/shifts/templates/shifts/template/shift_url_filter_form.html +++ b/src/shiftings/shifts/templates/shifts/template/shift_url_filter_form.html @@ -17,6 +17,32 @@