Skip to content

Commit aad6bb9

Browse files
authored
Merge pull request #72 from luftdaten-at/23-messkampagnen-erstellen-mit-überblicksseite-über-räume-und-personen
23 messkampagnen erstellen mit überblicksseite über räume und personen
2 parents 75a6165 + 14352ad commit aad6bb9

18 files changed

+494
-124
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Generated by Django 5.1.2 on 2024-12-10 08:48
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('api', '0003_devicelogs_measurementnew_values'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='devicelogs',
15+
name='id',
16+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17+
),
18+
migrations.AlterField(
19+
model_name='measurementnew',
20+
name='id',
21+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
22+
),
23+
migrations.AlterField(
24+
model_name='values',
25+
name='id',
26+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
27+
),
28+
]

app/api/models.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ class MeasurementNew(models.Model):
8282
"""
8383
Measurement taken by a device in a room.
8484
"""
85-
id = models.IntegerField(primary_key=True)
8685
time_received = models.DateTimeField()
8786
time_measured = models.DateTimeField()
8887
sensor_model = models.IntegerField()
@@ -97,7 +96,6 @@ class Values(models.Model):
9796
"""
9897
Values associated with a measurement.
9998
"""
100-
id = models.IntegerField(primary_key=True)
10199
dimension = models.IntegerField()
102100
value = models.FloatField()
103101
measurement = models.ForeignKey(MeasurementNew, on_delete=models.CASCADE)
@@ -110,7 +108,6 @@ class DeviceLogs(models.Model):
110108
"""
111109
Logs for each device.
112110
"""
113-
id = models.IntegerField(primary_key=True)
114111
device = models.ForeignKey(Device, on_delete=models.CASCADE)
115112
timestamp = models.DateTimeField()
116113
level = models.IntegerField()

app/campaign/forms.py

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
from django import forms
22
from django.utils.translation import gettext_lazy as _
3+
from django.contrib.admin.widgets import FilteredSelectMultiple
34

4-
from .models import Campaign
5+
from .models import Campaign, Organization, Room
6+
from accounts.models import CustomUser
57

68
from crispy_forms.helper import FormHelper
79
from crispy_forms.layout import Submit
810

911

12+
from django.conf import settings
13+
1014
class CampaignForm(forms.ModelForm):
1115
class Meta:
1216
model = Campaign
13-
fields = ['name', 'description', 'start_date', 'end_date', 'public']
17+
fields = ['name', 'description', 'start_date', 'end_date']
1418
labels = {
1519
'name': _('Name'),
1620
'description': _('Description'),
1721
'start_date': _('Start Date'),
1822
'end_date': _('End Date'),
19-
'public': _('Public'),
2023
}
2124
help_texts = {
2225
'name': _('Enter the name of the campaign.'),
@@ -27,11 +30,64 @@ class Meta:
2730
'start_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}, format='%Y-%m-%dT%H:%M'),
2831
'end_date': forms.DateTimeInput(attrs={'type': 'datetime-local', 'class': 'form-control'}, format='%Y-%m-%dT%H:%M'),
2932
}
30-
33+
3134
def __init__(self, *args, **kwargs):
32-
super(CampaignForm, self).__init__(*args, **kwargs)
35+
super().__init__(*args, **kwargs)
36+
37+
# Get the user from the passed arguments (initial data)
38+
self.user = kwargs.get('initial', {}).get('user', None)
39+
40+
# Initialize form helper
3341
self.helper = FormHelper(self)
3442
self.helper.add_input(Submit('submit', 'Save'))
43+
3544
# Ensure the input formats match the widget format
3645
self.fields['start_date'].input_formats = ('%Y-%m-%dT%H:%M',)
37-
self.fields['end_date'].input_formats = ('%Y-%m-%dT%H:%M',)
46+
self.fields['end_date'].input_formats = ('%Y-%m-%dT%H:%M',)
47+
48+
def save(self, commit=True):
49+
# Get the instance but don't save to the database yet
50+
campaign = super().save(commit=False)
51+
52+
# Set the `public` field to False
53+
campaign.public = False
54+
campaign.owner = self.user
55+
campaign.users.add(self.user)
56+
campaign.organization = self.user.organizations.first()
57+
58+
# Save to the database if commit is True
59+
if commit:
60+
campaign.save()
61+
62+
return campaign
63+
64+
class CampaignUserForm(forms.ModelForm):
65+
users = (forms.ModelMultipleChoiceField(label='',
66+
queryset=CustomUser.objects.none(),
67+
widget=FilteredSelectMultiple(
68+
verbose_name='Users',
69+
is_stacked=False,
70+
),
71+
required=False))
72+
73+
class Meta:
74+
model = Campaign
75+
fields = ['users']
76+
77+
class Media:
78+
css = {
79+
'all': ('/static/admin/css/widgets.css', '/static/css/adminoverrides.css', ),
80+
} # custom css
81+
82+
def __init__(self, *args, **kwargs):
83+
super().__init__(*args, **kwargs)
84+
85+
# Get the user from the passed arguments (initial data)
86+
self.campaign = kwargs.get('initial', {}).get('campaign', None)
87+
88+
if self.campaign:
89+
self.fields['users'].queryset = self.campaign.organization.users.all()
90+
91+
# Initialize form helper
92+
self.helper = FormHelper(self)
93+
self.helper.add_input(Submit('submit', 'Save'))
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.1.2 on 2024-12-10 08:48
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('campaign', '0002_alter_campaign_id_alter_campaign_name_organization_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='campaign',
15+
name='id',
16+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17+
),
18+
migrations.AlterField(
19+
model_name='organization',
20+
name='id',
21+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
22+
),
23+
]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.1.2 on 2024-12-10 08:54
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('campaign', '0003_alter_campaign_id_alter_organization_id'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='campaign',
16+
name='organization',
17+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='campaigns', to='campaign.organization'),
18+
),
19+
]
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Generated by Django 5.1.2 on 2024-12-10 09:22
2+
3+
from django.conf import settings
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('campaign', '0004_alter_campaign_organization'),
11+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12+
]
13+
14+
operations = [
15+
migrations.AlterUniqueTogether(
16+
name='userorganization',
17+
unique_together=None,
18+
),
19+
migrations.RemoveField(
20+
model_name='userorganization',
21+
name='organization',
22+
),
23+
migrations.RemoveField(
24+
model_name='userorganization',
25+
name='user',
26+
),
27+
migrations.AddField(
28+
model_name='campaign',
29+
name='users',
30+
field=models.ManyToManyField(related_name='campaign', to=settings.AUTH_USER_MODEL),
31+
),
32+
migrations.AddField(
33+
model_name='organization',
34+
name='users',
35+
field=models.ManyToManyField(related_name='organization', to=settings.AUTH_USER_MODEL),
36+
),
37+
migrations.DeleteModel(
38+
name='UserCampaign',
39+
),
40+
migrations.DeleteModel(
41+
name='UserOrganization',
42+
),
43+
]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Generated by Django 5.1.2 on 2024-12-10 09:24
2+
3+
from django.conf import settings
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('campaign', '0005_alter_userorganization_unique_together_and_more'),
11+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='campaign',
17+
name='users',
18+
field=models.ManyToManyField(related_name='campaigns', to=settings.AUTH_USER_MODEL),
19+
),
20+
migrations.AlterField(
21+
model_name='organization',
22+
name='users',
23+
field=models.ManyToManyField(related_name='organizations', to=settings.AUTH_USER_MODEL),
24+
),
25+
]

app/campaign/models.py

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ class Campaign(models.Model):
77
"""
88
Represents a campaign.
99
"""
10-
id = models.IntegerField(primary_key=True)
1110
name = models.CharField(max_length=255)
1211
description = models.TextField(null=True, blank=True)
1312
start_date = models.DateTimeField()
1413
end_date = models.DateTimeField()
1514
public = models.BooleanField(default=True)
1615
id_token = models.CharField(max_length=8, null=True)
16+
users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='campaigns')
17+
1718
owner = models.ForeignKey(
1819
settings.AUTH_USER_MODEL,
1920
on_delete=models.CASCADE,
@@ -24,7 +25,8 @@ class Campaign(models.Model):
2425
organization = models.ForeignKey(
2526
'Organization',
2627
on_delete=models.CASCADE,
27-
related_name='campaigns'
28+
related_name='campaigns',
29+
null = True
2830
)
2931

3032
def __str__(self):
@@ -49,9 +51,10 @@ class Organization(models.Model):
4951
"""
5052
Represents an organization that owns campaigns and users can be part of.
5153
"""
52-
id = models.IntegerField(primary_key=True)
5354
name = models.CharField(max_length=255)
5455
description = models.TextField(null=True, blank=True)
56+
users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='organizations')
57+
5558
owner = models.ForeignKey(
5659
settings.AUTH_USER_MODEL,
5760
on_delete=models.CASCADE,
@@ -60,31 +63,3 @@ class Organization(models.Model):
6063

6164
def __str__(self):
6265
return self.name
63-
64-
65-
class UserOrganization(models.Model):
66-
"""
67-
Represents the many-to-many relationship between users and organizations.
68-
"""
69-
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
70-
organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
71-
72-
class Meta:
73-
unique_together = ('user', 'organization')
74-
75-
def __str__(self):
76-
return f'{self.user} in {self.organization}'
77-
78-
79-
class UserCampaign(models.Model):
80-
"""
81-
Represents the many-to-many relationship between users and campaigns.
82-
"""
83-
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
84-
campaign = models.ForeignKey('Campaign', on_delete=models.CASCADE)
85-
86-
class Meta:
87-
unique_together = ('user', 'campaign')
88-
89-
def __str__(self):
90-
return f'{self.user} in {self.campaign}'

0 commit comments

Comments
 (0)