Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
AKPlanning
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Dominik Weitz
AKPlanning
Commits
4b485e37
Commit
4b485e37
authored
4 years ago
by
Nadja Geisler
Browse files
Options
Downloads
Patches
Plain Diff
fix event-dependent unique constraints in AKModel
parent
8437ee5a
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
AKModel/migrations/0028_unique_constraints.py
+57
-0
57 additions, 0 deletions
AKModel/migrations/0028_unique_constraints.py
AKModel/models.py
+15
-13
15 additions, 13 deletions
AKModel/models.py
AKSubmission/views.py
+13
-8
13 additions, 8 deletions
AKSubmission/views.py
with
85 additions
and
21 deletions
AKModel/migrations/0028_unique_constraints.py
0 → 100644
+
57
−
0
View file @
4b485e37
# Generated by Django 2.2.6 on 2020-05-10 10:48
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'
AKModel
'
,
'
0027_event_timezone
'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'
akcategory
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
help_text
=
'
Name of the AK Category
'
,
max_length
=
64
,
verbose_name
=
'
Name
'
),
),
migrations
.
AlterField
(
model_name
=
'
akowner
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
blank
=
True
,
help_text
=
'
Slug for URL generation
'
,
max_length
=
64
,
verbose_name
=
'
Slug
'
),
),
migrations
.
AlterField
(
model_name
=
'
akrequirement
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
help_text
=
'
Name of the Requirement
'
,
max_length
=
128
,
verbose_name
=
'
Name
'
),
),
migrations
.
AlterField
(
model_name
=
'
aktrack
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
help_text
=
'
Name of the AK Track
'
,
max_length
=
64
,
verbose_name
=
'
Name
'
),
),
migrations
.
AlterUniqueTogether
(
name
=
'
ak
'
,
unique_together
=
{(
'
event
'
,
'
name
'
),
(
'
event
'
,
'
short_name
'
)},
),
migrations
.
AlterUniqueTogether
(
name
=
'
akcategory
'
,
unique_together
=
{(
'
event
'
,
'
name
'
)},
),
migrations
.
AlterUniqueTogether
(
name
=
'
akowner
'
,
unique_together
=
{(
'
event
'
,
'
name
'
,
'
institution
'
),
(
'
event
'
,
'
slug
'
)},
),
migrations
.
AlterUniqueTogether
(
name
=
'
akrequirement
'
,
unique_together
=
{(
'
event
'
,
'
name
'
)},
),
migrations
.
AlterUniqueTogether
(
name
=
'
aktrack
'
,
unique_together
=
{(
'
event
'
,
'
name
'
)},
),
migrations
.
AlterUniqueTogether
(
name
=
'
room
'
,
unique_together
=
{(
'
event
'
,
'
name
'
,
'
building
'
)},
),
]
This diff is collapsed.
Click to expand it.
AKModel/models.py
+
15
−
13
View file @
4b485e37
...
...
@@ -50,8 +50,7 @@ class AKOwner(models.Model):
"""
An AKOwner describes the person organizing/holding an AK.
"""
name
=
models
.
CharField
(
max_length
=
64
,
verbose_name
=
_
(
'
Nickname
'
),
help_text
=
_
(
'
Name to identify an AK owner by
'
))
slug
=
models
.
SlugField
(
max_length
=
64
,
blank
=
True
,
unique
=
True
,
verbose_name
=
_
(
'
Slug
'
),
help_text
=
_
(
'
Slug for URL generation
'
))
slug
=
models
.
SlugField
(
max_length
=
64
,
blank
=
True
,
verbose_name
=
_
(
'
Slug
'
),
help_text
=
_
(
'
Slug for URL generation
'
))
institution
=
models
.
CharField
(
max_length
=
128
,
blank
=
True
,
verbose_name
=
_
(
'
Institution
'
),
help_text
=
_
(
'
Uni etc.
'
))
link
=
models
.
URLField
(
blank
=
True
,
verbose_name
=
_
(
'
Web Link
'
),
help_text
=
_
(
'
Link to Homepage
'
))
...
...
@@ -62,7 +61,7 @@ class AKOwner(models.Model):
verbose_name
=
_
(
'
AK Owner
'
)
verbose_name_plural
=
_
(
'
AK Owners
'
)
ordering
=
[
'
name
'
]
unique_together
=
[[
'
name
'
,
'
institution
'
]]
unique_together
=
[[
'
event
'
,
'
name
'
,
'
institution
'
]
,
[
'
event
'
,
'
slug
'
]
]
def
__str__
(
self
):
if
self
.
institution
:
...
...
@@ -73,15 +72,15 @@ class AKOwner(models.Model):
max_length
=
self
.
_meta
.
get_field
(
'
slug
'
).
max_length
slug_candidate
=
slugify
(
self
.
name
)[:
max_length
]
if
not
AKOwner
.
objects
.
filter
(
slug
=
slug_candidate
).
exists
():
if
not
AKOwner
.
objects
.
filter
(
event
=
self
.
event
,
slug
=
slug_candidate
).
exists
():
self
.
slug
=
slug_candidate
return
slug_candidate
=
slugify
(
slug_candidate
+
'
_
'
+
self
.
institution
)[:
max_length
]
if
not
AKOwner
.
objects
.
filter
(
slug
=
slug_candidate
).
exists
():
if
not
AKOwner
.
objects
.
filter
(
event
=
self
.
event
,
slug
=
slug_candidate
).
exists
():
self
.
slug
=
slug_candidate
return
for
i
in
itertools
.
count
(
1
):
if
not
AKOwner
.
objects
.
filter
(
slug
=
slug_candidate
).
exists
():
if
not
AKOwner
.
objects
.
filter
(
event
=
self
.
event
,
slug
=
slug_candidate
).
exists
():
break
digits
=
len
(
str
(
i
))
slug_candidate
=
'
{}-{}
'
.
format
(
slug_candidate
[:
-
(
digits
+
1
)],
i
)
...
...
@@ -95,14 +94,14 @@ class AKOwner(models.Model):
super
().
save
(
*
args
,
**
kwargs
)
@staticmethod
def
get_by_slug
(
slug
):
return
AKOwner
.
objects
.
get
(
slug
=
slug
)
def
get_by_slug
(
event
,
slug
):
return
AKOwner
.
objects
.
get
(
event
=
event
,
slug
=
slug
)
class
AKCategory
(
models
.
Model
):
"""
An AKCategory describes the characteristics of an AK, e.g. content vs. recreational.
"""
name
=
models
.
CharField
(
max_length
=
64
,
unique
=
True
,
verbose_name
=
_
(
'
Name
'
),
help_text
=
_
(
'
Name of the AK Category
'
))
name
=
models
.
CharField
(
max_length
=
64
,
verbose_name
=
_
(
'
Name
'
),
help_text
=
_
(
'
Name of the AK Category
'
))
color
=
models
.
CharField
(
max_length
=
7
,
blank
=
True
,
verbose_name
=
_
(
'
Color
'
),
help_text
=
_
(
'
Color for displaying
'
))
description
=
models
.
TextField
(
blank
=
True
,
verbose_name
=
_
(
"
Description
"
),
help_text
=
_
(
"
Short description of this AK Category
"
))
...
...
@@ -114,6 +113,7 @@ class AKCategory(models.Model):
verbose_name
=
_
(
'
AK Category
'
)
verbose_name_plural
=
_
(
'
AK Categories
'
)
ordering
=
[
'
name
'
]
unique_together
=
[
'
event
'
,
'
name
'
]
def
__str__
(
self
):
return
self
.
name
...
...
@@ -122,7 +122,7 @@ class AKCategory(models.Model):
class
AKTrack
(
models
.
Model
):
"""
An AKTrack describes a set of semantically related AKs.
"""
name
=
models
.
CharField
(
max_length
=
64
,
unique
=
True
,
verbose_name
=
_
(
'
Name
'
),
help_text
=
_
(
'
Name of the AK Track
'
))
name
=
models
.
CharField
(
max_length
=
64
,
verbose_name
=
_
(
'
Name
'
),
help_text
=
_
(
'
Name of the AK Track
'
))
color
=
models
.
CharField
(
max_length
=
7
,
blank
=
True
,
verbose_name
=
_
(
'
Color
'
),
help_text
=
_
(
'
Color for displaying
'
))
event
=
models
.
ForeignKey
(
to
=
Event
,
on_delete
=
models
.
CASCADE
,
verbose_name
=
_
(
'
Event
'
),
...
...
@@ -132,6 +132,7 @@ class AKTrack(models.Model):
verbose_name
=
_
(
'
AK Track
'
)
verbose_name_plural
=
_
(
'
AK Tracks
'
)
ordering
=
[
'
name
'
]
unique_together
=
[
'
event
'
,
'
name
'
]
def
__str__
(
self
):
return
self
.
name
...
...
@@ -154,7 +155,7 @@ class AKTag(models.Model):
class
AKRequirement
(
models
.
Model
):
"""
An AKRequirement describes something needed to hold an AK, e.g. infrastructure.
"""
name
=
models
.
CharField
(
max_length
=
128
,
unique
=
True
,
verbose_name
=
_
(
'
Name
'
),
help_text
=
_
(
'
Name of the Requirement
'
))
name
=
models
.
CharField
(
max_length
=
128
,
verbose_name
=
_
(
'
Name
'
),
help_text
=
_
(
'
Name of the Requirement
'
))
event
=
models
.
ForeignKey
(
to
=
Event
,
on_delete
=
models
.
CASCADE
,
verbose_name
=
_
(
'
Event
'
),
help_text
=
_
(
'
Associated event
'
))
...
...
@@ -163,6 +164,7 @@ class AKRequirement(models.Model):
verbose_name
=
_
(
'
AK Requirement
'
)
verbose_name_plural
=
_
(
'
AK Requirements
'
)
ordering
=
[
'
name
'
]
unique_together
=
[
'
event
'
,
'
name
'
]
def
__str__
(
self
):
return
self
.
name
...
...
@@ -211,7 +213,7 @@ class AK(models.Model):
class
Meta
:
verbose_name
=
_
(
'
AK
'
)
verbose_name_plural
=
_
(
'
AKs
'
)
unique_together
=
[
(
'
name
'
,
'
event
'
)
,
(
'
short_name
'
,
'
event
'
)
]
unique_together
=
[
[
'
event
'
,
'
name
'
]
,
[
'
event
'
,
'
short_name
'
]
]
def
__str__
(
self
):
if
self
.
short_name
:
...
...
@@ -248,7 +250,7 @@ class Room(models.Model):
verbose_name
=
_
(
'
Room
'
)
verbose_name_plural
=
_
(
'
Rooms
'
)
ordering
=
[
'
building
'
,
'
name
'
]
unique_together
=
[
[
'
name
'
,
'
building
'
]
]
unique_together
=
[
'
event
'
,
'
name
'
,
'
building
'
]
@property
def
title
(
self
):
...
...
This diff is collapsed.
Click to expand it.
AKSubmission/views.py
+
13
−
8
View file @
4b485e37
...
...
@@ -128,13 +128,13 @@ class AKAndAKWishSubmissionView(EventSlugMixin, CreateView):
class
AKSubmissionView
(
AKAndAKWishSubmissionView
):
def
get_initial
(
self
):
initials
=
super
(
AKAndAKWishSubmissionView
,
self
).
get_initial
()
initials
[
'
owners
'
]
=
[
AKOwner
.
get_by_slug
(
self
.
kwargs
[
'
owner_slug
'
])]
initials
[
'
owners
'
]
=
[
AKOwner
.
get_by_slug
(
self
.
event
,
self
.
kwargs
[
'
owner_slug
'
])]
initials
[
'
event
'
]
=
self
.
event
return
initials
def
get_context_data
(
self
,
*
,
object_list
=
None
,
**
kwargs
):
context
=
super
().
get_context_data
(
object_list
=
object_list
,
**
kwargs
)
context
[
'
owner
'
]
=
get_object_or_404
(
AKOwner
,
slug
=
self
.
kwargs
[
'
owner_slug
'
])
context
[
'
owner
'
]
=
get_object_or_404
(
AKOwner
,
event
=
self
.
event
,
slug
=
self
.
kwargs
[
'
owner_slug
'
])
return
context
...
...
@@ -206,7 +206,7 @@ class AKOwnerSelectDispatchView(EventSlugMixin, View):
reverse_lazy
(
'
submit:submit_ak
'
,
kwargs
=
{
'
event_slug
'
:
kwargs
[
'
event_slug
'
],
'
owner_slug
'
:
owner
.
slug
}))
class
AKOwnerEditView
(
EventSlugMixin
,
UpdateView
):
class
AKOwnerEditView
(
FilterBy
EventSlugMixin
,
UpdateView
):
model
=
AKOwner
template_name
=
"
AKSubmission/akowner_create_update.html
"
form_class
=
AKOwnerForm
...
...
@@ -252,7 +252,8 @@ class AKSlotAddView(EventSlugMixin, CreateView):
def
get_success_url
(
self
):
messages
.
add_message
(
self
.
request
,
messages
.
SUCCESS
,
_
(
"
AK Slot successfully added
"
))
return
reverse_lazy
(
'
submit:ak_detail
'
,
kwargs
=
{
'
event_slug
'
:
self
.
kwargs
[
'
event_slug
'
],
'
pk
'
:
self
.
object
.
ak
.
pk
})
return
reverse_lazy
(
'
submit:ak_detail
'
,
kwargs
=
{
'
event_slug
'
:
self
.
kwargs
[
'
event_slug
'
],
'
pk
'
:
self
.
object
.
ak
.
pk
})
class
AKSlotEditView
(
EventSlugMixin
,
UpdateView
):
...
...
@@ -263,7 +264,8 @@ class AKSlotEditView(EventSlugMixin, UpdateView):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
akslot
=
get_object_or_404
(
AKSlot
,
pk
=
kwargs
[
"
pk
"
])
if
akslot
.
start
is
not
None
:
messages
.
add_message
(
self
.
request
,
messages
.
WARNING
,
_
(
"
You cannot edit a slot that has already been scheduled
"
))
messages
.
add_message
(
self
.
request
,
messages
.
WARNING
,
_
(
"
You cannot edit a slot that has already been scheduled
"
))
return
redirect
(
'
submit:ak_detail
'
,
event_slug
=
self
.
kwargs
[
'
event_slug
'
],
pk
=
akslot
.
ak
.
pk
)
return
super
().
get
(
request
,
*
args
,
**
kwargs
)
...
...
@@ -274,7 +276,8 @@ class AKSlotEditView(EventSlugMixin, UpdateView):
def
get_success_url
(
self
):
messages
.
add_message
(
self
.
request
,
messages
.
SUCCESS
,
_
(
"
AK Slot successfully updated
"
))
return
reverse_lazy
(
'
submit:ak_detail
'
,
kwargs
=
{
'
event_slug
'
:
self
.
kwargs
[
'
event_slug
'
],
'
pk
'
:
self
.
object
.
ak
.
pk
})
return
reverse_lazy
(
'
submit:ak_detail
'
,
kwargs
=
{
'
event_slug
'
:
self
.
kwargs
[
'
event_slug
'
],
'
pk
'
:
self
.
object
.
ak
.
pk
})
class
AKSlotDeleteView
(
EventSlugMixin
,
DeleteView
):
...
...
@@ -284,7 +287,8 @@ class AKSlotDeleteView(EventSlugMixin, DeleteView):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
akslot
=
get_object_or_404
(
AKSlot
,
pk
=
kwargs
[
"
pk
"
])
if
akslot
.
start
is
not
None
:
messages
.
add_message
(
self
.
request
,
messages
.
WARNING
,
_
(
"
You cannot delete a slot that has already been scheduled
"
))
messages
.
add_message
(
self
.
request
,
messages
.
WARNING
,
_
(
"
You cannot delete a slot that has already been scheduled
"
))
return
redirect
(
'
submit:ak_detail
'
,
event_slug
=
self
.
kwargs
[
'
event_slug
'
],
pk
=
akslot
.
ak
.
pk
)
return
super
().
get
(
request
,
*
args
,
**
kwargs
)
...
...
@@ -295,4 +299,5 @@ class AKSlotDeleteView(EventSlugMixin, DeleteView):
def
get_success_url
(
self
):
messages
.
add_message
(
self
.
request
,
messages
.
SUCCESS
,
_
(
"
AK Slot successfully deleted
"
))
return
reverse_lazy
(
'
submit:ak_detail
'
,
kwargs
=
{
'
event_slug
'
:
self
.
kwargs
[
'
event_slug
'
],
'
pk
'
:
self
.
object
.
ak
.
pk
})
return
reverse_lazy
(
'
submit:ak_detail
'
,
kwargs
=
{
'
event_slug
'
:
self
.
kwargs
[
'
event_slug
'
],
'
pk
'
:
self
.
object
.
ak
.
pk
})
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment