Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
steering
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
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
AURA
steering
Commits
da167048
Commit
da167048
authored
3 years ago
by
Ernesto Rico Schmidt
Browse files
Options
Downloads
Patches
Plain Diff
Remove verbose_names, *_CHOICES and str methods
parent
b9ab9593
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
program/migrations/0013_auto_20220221_1637.py
+515
-0
515 additions, 0 deletions
program/migrations/0013_auto_20220221_1637.py
program/models.py
+94
-208
94 additions, 208 deletions
program/models.py
with
609 additions
and
208 deletions
program/migrations/0013_auto_20220221_1637.py
0 → 100644
+
515
−
0
View file @
da167048
# Generated by Django 3.2.11 on 2022-02-21 15:37
from
django.conf
import
settings
from
django.db
import
migrations
,
models
import
django.db.models.deletion
import
versatileimagefield.fields
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
migrations
.
swappable_dependency
(
settings
.
AUTH_USER_MODEL
),
(
'
program
'
,
'
0012_rename_fields
'
),
]
operations
=
[
migrations
.
AlterModelOptions
(
name
=
'
category
'
,
options
=
{
'
ordering
'
:
(
'
name
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
fundingcategory
'
,
options
=
{
'
ordering
'
:
(
'
name
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
host
'
,
options
=
{
'
ordering
'
:
(
'
name
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
language
'
,
options
=
{
'
ordering
'
:
(
'
language
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
musicfocus
'
,
options
=
{
'
ordering
'
:
(
'
name
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
note
'
,
options
=
{
'
ordering
'
:
(
'
timeslot
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
rrule
'
,
options
=
{
'
ordering
'
:
(
'
pk
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
schedule
'
,
options
=
{
'
ordering
'
:
(
'
dstart
'
,
'
tstart
'
)},
),
migrations
.
AlterModelOptions
(
name
=
'
show
'
,
options
=
{
'
ordering
'
:
(
'
slug
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
timeslot
'
,
options
=
{
'
ordering
'
:
(
'
start
'
,
'
end
'
)},
),
migrations
.
AlterModelOptions
(
name
=
'
topic
'
,
options
=
{
'
ordering
'
:
(
'
name
'
,)},
),
migrations
.
AlterModelOptions
(
name
=
'
type
'
,
options
=
{
'
ordering
'
:
(
'
name
'
,)},
),
migrations
.
AlterField
(
model_name
=
'
category
'
,
name
=
'
abbrev
'
,
field
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
category
'
,
name
=
'
description
'
,
field
=
models
.
TextField
(
blank
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
category
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
category
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
),
),
migrations
.
AlterField
(
model_name
=
'
category
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
fundingcategory
'
,
name
=
'
abbrev
'
,
field
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
fundingcategory
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
fundingcategory
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
),
),
migrations
.
AlterField
(
model_name
=
'
fundingcategory
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
biography
'
,
field
=
models
.
TextField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
email
'
,
field
=
models
.
EmailField
(
blank
=
True
,
max_length
=
254
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
height
'
,
field
=
models
.
PositiveIntegerField
(
blank
=
True
,
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
image
'
,
field
=
versatileimagefield
.
fields
.
VersatileImageField
(
blank
=
True
,
height_field
=
'
height
'
,
null
=
True
,
upload_to
=
'
host_images
'
,
width_field
=
'
width
'
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
128
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
ppoi
'
,
field
=
versatileimagefield
.
fields
.
PPOIField
(
default
=
'
0.5x0.5
'
,
editable
=
False
,
max_length
=
20
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
website
'
,
field
=
models
.
URLField
(
blank
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
host
'
,
name
=
'
width
'
,
field
=
models
.
PositiveIntegerField
(
blank
=
True
,
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
language
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
language
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
),
),
migrations
.
AlterField
(
model_name
=
'
musicfocus
'
,
name
=
'
abbrev
'
,
field
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
musicfocus
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
musicfocus
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
),
),
migrations
.
AlterField
(
model_name
=
'
musicfocus
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
audio_url
'
,
field
=
models
.
TextField
(
blank
=
True
,
editable
=
False
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
cba_id
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
content
'
,
field
=
models
.
TextField
(),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
height
'
,
field
=
models
.
PositiveIntegerField
(
blank
=
True
,
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
image
'
,
field
=
versatileimagefield
.
fields
.
VersatileImageField
(
blank
=
True
,
height_field
=
'
height
'
,
null
=
True
,
upload_to
=
'
note_images
'
,
width_field
=
'
width
'
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
ppoi
'
,
field
=
versatileimagefield
.
fields
.
PPOIField
(
default
=
'
0.5x0.5
'
,
editable
=
False
,
max_length
=
20
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
status
'
,
field
=
models
.
IntegerField
(
default
=
1
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
summary
'
,
field
=
models
.
TextField
(
blank
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
timeslot
'
,
field
=
models
.
OneToOneField
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
to
=
'
program.timeslot
'
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
title
'
,
field
=
models
.
CharField
(
max_length
=
128
),
),
migrations
.
AlterField
(
model_name
=
'
note
'
,
name
=
'
width
'
,
field
=
models
.
PositiveIntegerField
(
blank
=
True
,
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
rrule
'
,
name
=
'
bysetpos
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
rrule
'
,
name
=
'
count
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
rrule
'
,
name
=
'
freq
'
,
field
=
models
.
IntegerField
(),
),
migrations
.
AlterField
(
model_name
=
'
rrule
'
,
name
=
'
interval
'
,
field
=
models
.
IntegerField
(
default
=
1
),
),
migrations
.
AlterField
(
model_name
=
'
rrule
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
add_business_days_only
'
,
field
=
models
.
BooleanField
(
default
=
False
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
add_days_no
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
byweekday
'
,
field
=
models
.
IntegerField
(),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
default_playlist_id
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
dstart
'
,
field
=
models
.
DateField
(),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
is_repetition
'
,
field
=
models
.
BooleanField
(
default
=
False
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
rrule
'
,
field
=
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
related_name
=
'
schedules
'
,
to
=
'
program.rrule
'
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
show
'
,
field
=
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
related_name
=
'
schedules
'
,
to
=
'
program.show
'
),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
tend
'
,
field
=
models
.
TimeField
(),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
tstart
'
,
field
=
models
.
TimeField
(),
),
migrations
.
AlterField
(
model_name
=
'
schedule
'
,
name
=
'
until
'
,
field
=
models
.
DateField
(),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
category
'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
related_name
=
'
shows
'
,
to
=
'
program.Category
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
cba_series_id
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
default_playlist_id
'
,
field
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
description
'
,
field
=
models
.
TextField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
email
'
,
field
=
models
.
EmailField
(
blank
=
True
,
max_length
=
254
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
fundingcategory
'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
related_name
=
'
shows
'
,
to
=
'
program.fundingcategory
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
height
'
,
field
=
models
.
PositiveIntegerField
(
blank
=
True
,
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
hosts
'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
related_name
=
'
shows
'
,
to
=
'
program.Host
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
image
'
,
field
=
versatileimagefield
.
fields
.
VersatileImageField
(
blank
=
True
,
height_field
=
'
height
'
,
null
=
True
,
upload_to
=
'
show_images
'
,
width_field
=
'
width
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
is_public
'
,
field
=
models
.
BooleanField
(
default
=
False
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
language
'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
related_name
=
'
language
'
,
to
=
'
program.Language
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
logo
'
,
field
=
models
.
ImageField
(
blank
=
True
,
null
=
True
,
upload_to
=
'
show_images
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
musicfocus
'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
related_name
=
'
shows
'
,
to
=
'
program.MusicFocus
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
255
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
owners
'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
related_name
=
'
shows
'
,
to
=
settings
.
AUTH_USER_MODEL
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
ppoi
'
,
field
=
versatileimagefield
.
fields
.
PPOIField
(
default
=
'
0.5x0.5
'
,
editable
=
False
,
max_length
=
20
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
predecessor
'
,
field
=
models
.
ForeignKey
(
blank
=
True
,
null
=
True
,
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
related_name
=
'
successors
'
,
to
=
'
program.show
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
short_description
'
,
field
=
models
.
TextField
(),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
slug
'
,
field
=
models
.
CharField
(
max_length
=
255
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
topic
'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
related_name
=
'
shows
'
,
to
=
'
program.Topic
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
type
'
,
field
=
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
related_name
=
'
shows
'
,
to
=
'
program.type
'
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
website
'
,
field
=
models
.
URLField
(
blank
=
True
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
show
'
,
name
=
'
width
'
,
field
=
models
.
PositiveIntegerField
(
blank
=
True
,
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
end
'
,
field
=
models
.
DateTimeField
(),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
is_repetition
'
,
field
=
models
.
BooleanField
(
default
=
False
),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
memo
'
,
field
=
models
.
TextField
(
blank
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
note_id
'
,
field
=
models
.
IntegerField
(
editable
=
False
,
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
playlist_id
'
,
field
=
models
.
IntegerField
(
null
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
schedule
'
,
field
=
models
.
ForeignKey
(
on_delete
=
django
.
db
.
models
.
deletion
.
CASCADE
,
related_name
=
'
timeslots
'
,
to
=
'
program.schedule
'
),
),
migrations
.
AlterField
(
model_name
=
'
timeslot
'
,
name
=
'
start
'
,
field
=
models
.
DateTimeField
(),
),
migrations
.
AlterField
(
model_name
=
'
topic
'
,
name
=
'
abbrev
'
,
field
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
topic
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
topic
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
),
),
migrations
.
AlterField
(
model_name
=
'
topic
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
type
'
,
name
=
'
is_active
'
,
field
=
models
.
BooleanField
(
default
=
True
),
),
migrations
.
AlterField
(
model_name
=
'
type
'
,
name
=
'
name
'
,
field
=
models
.
CharField
(
max_length
=
32
),
),
migrations
.
AlterField
(
model_name
=
'
type
'
,
name
=
'
slug
'
,
field
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
),
),
]
This diff is collapsed.
Click to expand it.
program/models.py
+
94
−
208
View file @
da167048
...
...
@@ -36,112 +36,77 @@ from program.utils import parse_datetime, parse_date, parse_time
class
Type
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Type
"
),
max_length
=
32
)
slug
=
models
.
SlugField
(
_
(
"
Slug
"
),
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
name
=
models
.
CharField
(
max_length
=
32
)
slug
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
default
=
True
)
class
Meta
:
ordering
=
(
'
name
'
,)
verbose_name
=
_
(
"
Type
"
)
verbose_name_plural
=
_
(
"
Types
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
Category
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Category
"
),
max_length
=
32
)
abbrev
=
models
.
CharField
(
_
(
"
Abbreviation
"
),
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
_
(
"
Slug
"
),
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
description
=
models
.
TextField
(
_
(
"
Description
"
),
blank
=
True
)
name
=
models
.
CharField
(
max_length
=
32
)
abbrev
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
default
=
True
)
description
=
models
.
TextField
(
blank
=
True
)
class
Meta
:
ordering
=
(
'
name
'
,)
verbose_name
=
_
(
"
Category
"
)
verbose_name_plural
=
_
(
"
Categories
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
Topic
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Topic
"
),
max_length
=
32
)
abbrev
=
models
.
CharField
(
_
(
"
Abbreviation
"
),
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
_
(
"
Slug
"
),
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
name
=
models
.
CharField
(
max_length
=
32
)
abbrev
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
default
=
True
)
class
Meta
:
ordering
=
(
'
name
'
,)
verbose_name
=
_
(
"
Topic
"
)
verbose_name_plural
=
_
(
"
Topics
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
MusicFocus
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Focus
"
),
max_length
=
32
)
abbrev
=
models
.
CharField
(
_
(
"
Abbreviation
"
),
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
_
(
"
Slug
"
),
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
name
=
models
.
CharField
(
max_length
=
32
)
abbrev
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
default
=
True
)
class
Meta
:
ordering
=
(
'
name
'
,)
verbose_name
=
_
(
"
Music focus
"
)
verbose_name_plural
=
_
(
"
Music focus
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
FundingCategory
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Funding Category
"
),
max_length
=
32
)
abbrev
=
models
.
CharField
(
_
(
"
Abbreviation
"
),
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
_
(
"
Slug
"
),
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
name
=
models
.
CharField
(
max_length
=
32
)
abbrev
=
models
.
CharField
(
max_length
=
4
,
unique
=
True
)
slug
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
)
is_active
=
models
.
BooleanField
(
default
=
True
)
class
Meta
:
ordering
=
(
'
name
'
,)
verbose_name
=
_
(
"
Funding Category
"
)
verbose_name_plural
=
_
(
"
Funding Categories
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
Language
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Language
"
),
max_length
=
32
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
name
=
models
.
CharField
(
max_length
=
32
)
is_active
=
models
.
BooleanField
(
default
=
True
)
class
Meta
:
ordering
=
(
'
language
'
,)
verbose_name
=
_
(
"
Language
"
)
verbose_name_plural
=
_
(
"
Languages
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
Host
(
models
.
Model
):
name
=
models
.
CharField
(
_
(
"
Name
"
),
max_length
=
128
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
email
=
models
.
EmailField
(
_
(
"
E-Mail
"
),
blank
=
True
)
website
=
models
.
URLField
(
_
(
"
Website
"
),
blank
=
True
)
biography
=
models
.
TextField
(
_
(
"
Biography
"
),
blank
=
True
,
null
=
True
)
ppoi
=
PPOIField
(
'
Image PPOI
'
)
height
=
models
.
PositiveIntegerField
(
'
Image Height
'
,
blank
=
True
,
null
=
True
,
editable
=
False
)
width
=
models
.
PositiveIntegerField
(
'
Image Width
'
,
blank
=
True
,
null
=
True
,
editable
=
False
)
image
=
VersatileImageField
(
_
(
"
Profile picture
"
),
blank
=
True
,
null
=
True
,
upload_to
=
'
host_images
'
,
width_field
=
'
width
'
,
name
=
models
.
CharField
(
max_length
=
128
)
is_active
=
models
.
BooleanField
(
default
=
True
)
email
=
models
.
EmailField
(
blank
=
True
)
website
=
models
.
URLField
(
blank
=
True
)
biography
=
models
.
TextField
(
blank
=
True
,
null
=
True
)
ppoi
=
PPOIField
()
height
=
models
.
PositiveIntegerField
(
blank
=
True
,
null
=
True
,
editable
=
False
)
width
=
models
.
PositiveIntegerField
(
blank
=
True
,
null
=
True
,
editable
=
False
)
image
=
VersatileImageField
(
blank
=
True
,
null
=
True
,
upload_to
=
'
host_images
'
,
width_field
=
'
width
'
,
height_field
=
'
height
'
,
ppoi_field
=
'
ppoi
'
)
class
Meta
:
ordering
=
(
'
name
'
,)
verbose_name
=
_
(
"
Host
"
)
verbose_name_plural
=
_
(
"
Hosts
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
def
save
(
self
,
*
args
,
**
kwargs
):
super
(
Host
,
self
).
save
(
*
args
,
**
kwargs
)
...
...
@@ -170,51 +135,38 @@ class Link(models.Model):
description
=
models
.
CharField
(
max_length
=
8
)
url
=
models
.
URLField
()
def
__str__
(
self
):
return
'
%s: %s
'
%
(
self
.
description
,
self
.
url
)
class
Show
(
models
.
Model
):
predecessor
=
models
.
ForeignKey
(
'
self
'
,
blank
=
True
,
null
=
True
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
successors
'
,
verbose_name
=
_
(
"
Predecessor
"
))
hosts
=
models
.
ManyToManyField
(
Host
,
blank
=
True
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Hosts
"
))
owners
=
models
.
ManyToManyField
(
User
,
blank
=
True
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Owners
"
))
language
=
models
.
ManyToManyField
(
Language
,
blank
=
True
,
related_name
=
'
language
'
,
verbose_name
=
_
(
"
Language
"
))
type
=
models
.
ForeignKey
(
Type
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Type
"
))
category
=
models
.
ManyToManyField
(
Category
,
blank
=
True
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Category
"
))
fundingcategory
=
models
.
ForeignKey
(
FundingCategory
,
null
=
True
,
on_delete
=
models
.
CASCADE
,
blank
=
True
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Funding Category
"
))
topic
=
models
.
ManyToManyField
(
Topic
,
blank
=
True
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Topic
"
))
musicfocus
=
models
.
ManyToManyField
(
MusicFocus
,
blank
=
True
,
related_name
=
'
shows
'
,
verbose_name
=
_
(
"
Music focus
"
))
name
=
models
.
CharField
(
_
(
"
Name
"
),
max_length
=
255
)
slug
=
models
.
CharField
(
_
(
"
Slug
"
),
max_length
=
255
,
unique
=
True
)
ppoi
=
PPOIField
(
'
Image PPOI
'
)
height
=
models
.
PositiveIntegerField
(
'
Image Height
'
,
blank
=
True
,
null
=
True
,
editable
=
False
)
width
=
models
.
PositiveIntegerField
(
'
Image Width
'
,
blank
=
True
,
null
=
True
,
editable
=
False
)
image
=
VersatileImageField
(
_
(
"
Image
"
),
blank
=
True
,
null
=
True
,
upload_to
=
'
show_images
'
,
width_field
=
'
width
'
,
height_field
=
'
height
'
,
ppoi_field
=
'
ppoi
'
)
logo
=
models
.
ImageField
(
_
(
"
Logo
"
),
blank
=
True
,
null
=
True
,
upload_to
=
'
show_images
'
)
short_description
=
models
.
TextField
(
_
(
"
Short description
"
))
description
=
models
.
TextField
(
_
(
"
Description
"
),
blank
=
True
,
null
=
True
)
email
=
models
.
EmailField
(
_
(
"
E-Mail
"
),
blank
=
True
,
null
=
True
)
website
=
models
.
URLField
(
_
(
"
Website
"
),
blank
=
True
,
null
=
True
)
cba_series_id
=
models
.
IntegerField
(
_
(
"
CBA Series ID
"
),
blank
=
True
,
null
=
True
)
default_playlist_id
=
models
.
IntegerField
(
_
(
"
Default Playlist ID
"
),
blank
=
True
,
null
=
True
)
predecessor
=
models
.
ForeignKey
(
'
self
'
,
blank
=
True
,
null
=
True
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
successors
'
)
hosts
=
models
.
ManyToManyField
(
Host
,
blank
=
True
,
related_name
=
'
shows
'
)
owners
=
models
.
ManyToManyField
(
User
,
blank
=
True
,
related_name
=
'
shows
'
)
language
=
models
.
ManyToManyField
(
Language
,
blank
=
True
,
related_name
=
'
language
'
)
type
=
models
.
ForeignKey
(
Type
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
shows
'
)
category
=
models
.
ManyToManyField
(
Category
,
blank
=
True
,
related_name
=
'
shows
'
)
fundingcategory
=
models
.
ForeignKey
(
FundingCategory
,
null
=
True
,
on_delete
=
models
.
CASCADE
,
blank
=
True
,
related_name
=
'
shows
'
)
topic
=
models
.
ManyToManyField
(
Topic
,
blank
=
True
,
related_name
=
'
shows
'
)
musicfocus
=
models
.
ManyToManyField
(
MusicFocus
,
blank
=
True
,
related_name
=
'
shows
'
)
name
=
models
.
CharField
(
max_length
=
255
)
slug
=
models
.
CharField
(
max_length
=
255
,
unique
=
True
)
ppoi
=
PPOIField
()
height
=
models
.
PositiveIntegerField
(
blank
=
True
,
null
=
True
,
editable
=
False
)
width
=
models
.
PositiveIntegerField
(
blank
=
True
,
null
=
True
,
editable
=
False
)
image
=
VersatileImageField
(
blank
=
True
,
null
=
True
,
upload_to
=
'
show_images
'
,
width_field
=
'
width
'
,
height_field
=
'
height
'
,
ppoi_field
=
'
ppoi
'
)
logo
=
models
.
ImageField
(
blank
=
True
,
null
=
True
,
upload_to
=
'
show_images
'
)
short_description
=
models
.
TextField
()
description
=
models
.
TextField
(
blank
=
True
,
null
=
True
)
email
=
models
.
EmailField
(
blank
=
True
,
null
=
True
)
website
=
models
.
URLField
(
blank
=
True
,
null
=
True
)
cba_series_id
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
default_playlist_id
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
created
=
models
.
DateTimeField
(
auto_now_add
=
True
,
editable
=
False
)
last_updated
=
models
.
DateTimeField
(
auto_now
=
True
,
editable
=
False
)
is_active
=
models
.
BooleanField
(
_
(
"
Is active?
"
),
default
=
True
)
is_public
=
models
.
BooleanField
(
_
(
"
Is Public?
"
),
default
=
False
)
is_active
=
models
.
BooleanField
(
default
=
True
)
is_public
=
models
.
BooleanField
(
default
=
False
)
class
Meta
:
ordering
=
(
'
slug
'
,)
verbose_name
=
_
(
"
Show
"
)
verbose_name_plural
=
_
(
"
Shows
"
)
def
__str__
(
self
):
if
self
.
id
is
None
:
return
'
%s
'
%
self
.
name
return
'
%04d | %s
'
%
(
self
.
id
,
self
.
name
)
# FIXME: this does not belong here
@staticmethod
...
...
@@ -231,79 +183,33 @@ class Show(models.Model):
class
RRule
(
models
.
Model
):
FREQ_CHOICES
=
(
(
1
,
_
(
"
Monthly
"
)),
(
2
,
_
(
"
Weekly
"
)),
(
3
,
_
(
"
Daily
"
)),
)
BYSETPOS_CHOICES
=
(
(
1
,
_
(
"
First
"
)),
(
2
,
_
(
"
Second
"
)),
(
3
,
_
(
"
Third
"
)),
(
4
,
_
(
"
Fourth
"
)),
(
5
,
_
(
"
Fifth
"
)),
(
-
1
,
_
(
"
Last
"
)),
)
name
=
models
.
CharField
(
_
(
"
Name
"
),
max_length
=
32
,
unique
=
True
)
freq
=
models
.
IntegerField
(
_
(
"
Frequency
"
),
choices
=
FREQ_CHOICES
)
interval
=
models
.
IntegerField
(
_
(
"
Interval
"
),
default
=
1
)
bysetpos
=
models
.
IntegerField
(
_
(
"
Set position
"
),
blank
=
True
,
choices
=
BYSETPOS_CHOICES
,
null
=
True
)
count
=
models
.
IntegerField
(
_
(
"
Count
"
),
blank
=
True
,
null
=
True
)
name
=
models
.
CharField
(
max_length
=
32
,
unique
=
True
)
freq
=
models
.
IntegerField
()
interval
=
models
.
IntegerField
(
default
=
1
)
bysetpos
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
count
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
class
Meta
:
ordering
=
(
'
pk
'
,)
verbose_name
=
_
(
"
Recurrence rule
"
)
verbose_name_plural
=
_
(
"
Recurrence rules
"
)
def
__str__
(
self
):
return
'
%s
'
%
self
.
name
class
Schedule
(
models
.
Model
):
BYWEEKDAY_CHOICES
=
(
(
0
,
_
(
"
Monday
"
)),
(
1
,
_
(
"
Tuesday
"
)),
(
2
,
_
(
"
Wednesday
"
)),
(
3
,
_
(
"
Thursday
"
)),
(
4
,
_
(
"
Friday
"
)),
(
5
,
_
(
"
Saturday
"
)),
(
6
,
_
(
"
Sunday
"
)),
)
rrule
=
models
.
ForeignKey
(
RRule
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
schedules
'
,
verbose_name
=
_
(
"
Recurrence rule
"
))
byweekday
=
models
.
IntegerField
(
_
(
"
Weekday
"
),
choices
=
BYWEEKDAY_CHOICES
)
show
=
models
.
ForeignKey
(
Show
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
schedules
'
,
verbose_name
=
_
(
"
Show
"
))
dstart
=
models
.
DateField
(
_
(
"
First date
"
))
tstart
=
models
.
TimeField
(
_
(
"
Start time
"
))
tend
=
models
.
TimeField
(
_
(
"
End time
"
))
until
=
models
.
DateField
(
_
(
"
Last date
"
))
is_repetition
=
models
.
BooleanField
(
_
(
"
Is repetition
"
),
default
=
False
)
add_days_no
=
models
.
IntegerField
(
_
(
"
Add days
"
),
blank
=
True
,
null
=
True
)
add_business_days_only
=
models
.
BooleanField
(
_
(
"
Only add business days?
"
),
default
=
False
)
default_playlist_id
=
models
.
IntegerField
(
_
(
"
Default Playlist ID
"
),
blank
=
True
,
null
=
True
)
# -> both see https://stackoverflow.com/questions/1737017/django-auto-now-and-auto-now-add
created
=
models
.
DateTimeField
(
auto_now_add
=
True
,
editable
=
False
,
null
=
True
)
rrule
=
models
.
ForeignKey
(
RRule
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
schedules
'
)
byweekday
=
models
.
IntegerField
()
show
=
models
.
ForeignKey
(
Show
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
schedules
'
)
dstart
=
models
.
DateField
()
tstart
=
models
.
TimeField
()
tend
=
models
.
TimeField
()
until
=
models
.
DateField
()
is_repetition
=
models
.
BooleanField
(
default
=
False
)
add_days_no
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
add_business_days_only
=
models
.
BooleanField
(
default
=
False
)
default_playlist_id
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
created
=
models
.
DateTimeField
(
auto_now_add
=
True
,
editable
=
False
,
null
=
True
)
last_updated
=
models
.
DateTimeField
(
auto_now
=
True
,
editable
=
False
,
null
=
True
)
class
Meta
:
ordering
=
(
'
dstart
'
,
'
tstart
'
)
verbose_name
=
_
(
"
Schedule
"
)
verbose_name_plural
=
_
(
"
Schedules
"
)
def
__str__
(
self
):
weekday
=
self
.
BYWEEKDAY_CHOICES
[
self
.
byweekday
][
1
]
tend
=
self
.
tend
.
strftime
(
'
%H:%M
'
)
dstart
=
self
.
dstart
.
strftime
(
'
%d. %b %Y
'
)
tstart
=
self
.
tstart
.
strftime
(
'
%H:%M
'
)
if
self
.
rrule
.
freq
==
0
:
return
'
%s %s, %s - %s
'
%
(
self
.
rrule
,
dstart
,
tstart
,
tend
)
if
self
.
rrule
.
freq
==
3
:
return
'
%s, %s - %s
'
%
(
self
.
rrule
,
tstart
,
tend
)
else
:
return
'
%s, %s, %s - %s
'
%
(
weekday
,
self
.
rrule
,
tstart
,
tend
)
# FIXME: this does not belong here
@staticmethod
...
...
@@ -964,36 +870,26 @@ class TimeSlotManager(models.Manager):
class
TimeSlot
(
models
.
Model
):
schedule
=
models
.
ForeignKey
(
Schedule
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
timeslots
'
,
verbose_name
=
_
(
"
Schedule
"
))
start
=
models
.
DateTimeField
(
_
(
"
Start time
"
))
# Removed 'unique=True' because new Timeslots need to be created before deleting the old ones (otherwise linked notes get
# deleted first)
end
=
models
.
DateTimeField
(
_
(
"
End time
"
))
schedule
=
models
.
ForeignKey
(
Schedule
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
timeslots
'
)
start
=
models
.
DateTimeField
()
end
=
models
.
DateTimeField
()
show
=
models
.
ForeignKey
(
Show
,
editable
=
False
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
timeslots
'
)
memo
=
models
.
TextField
(
_
(
"
Memo
"
),
blank
=
True
)
is_repetition
=
models
.
BooleanField
(
_
(
"
Is repetition?
"
),
default
=
False
)
playlist_id
=
models
.
IntegerField
(
_
(
"
Playlist ID
"
),
null
=
True
)
note_id
=
models
.
IntegerField
(
_
(
"
Note ID
"
),
null
=
True
,
editable
=
False
)
memo
=
models
.
TextField
(
blank
=
True
)
is_repetition
=
models
.
BooleanField
(
default
=
False
)
playlist_id
=
models
.
IntegerField
(
null
=
True
)
note_id
=
models
.
IntegerField
(
null
=
True
,
editable
=
False
)
objects
=
TimeSlotManager
()
class
Meta
:
ordering
=
(
'
start
'
,
'
end
'
)
verbose_name
=
_
(
"
Time slot
"
)
verbose_name_plural
=
_
(
"
Time slots
"
)
def
__str__
(
self
):
start
=
self
.
start
.
strftime
(
'
%a, %d.%m.%Y %H:%M
'
)
end
=
self
.
end
.
strftime
(
'
%H:%M
'
)
is_repetition
=
'
'
+
_
(
'
(REP)
'
)
if
self
.
schedule
.
is_repetition
is
True
else
''
return
'
%s - %s %s (%s)
'
%
(
start
,
end
,
is_repetition
,
self
.
show
.
name
)
def
save
(
self
,
*
args
,
**
kwargs
):
self
.
show
=
self
.
schedule
.
show
super
(
TimeSlot
,
self
).
save
(
*
args
,
**
kwargs
)
return
self
# FIXME: this should be a property
def
generate
(
self
):
"""
Returns the object instance without saving
"""
...
...
@@ -1007,26 +903,21 @@ class TimeSlot(models.Model):
class
Note
(
models
.
Model
):
STATUS_CHOICES
=
(
(
0
,
_
(
"
Cancellation
"
)),
(
1
,
_
(
"
Recommendation
"
)),
(
2
,
_
(
"
Repetition
"
)),
)
timeslot
=
models
.
OneToOneField
(
TimeSlot
,
on_delete
=
models
.
CASCADE
,
verbose_name
=
_
(
"
Time slot
"
),
unique
=
True
)
title
=
models
.
CharField
(
_
(
"
Title
"
),
max_length
=
128
)
slug
=
models
.
SlugField
(
_
(
"
Slug
"
),
max_length
=
32
,
unique
=
True
)
summary
=
models
.
TextField
(
_
(
"
Summary
"
),
blank
=
True
)
content
=
models
.
TextField
(
_
(
"
Content
"
))
ppoi
=
PPOIField
(
'
Image PPOI
'
)
height
=
models
.
PositiveIntegerField
(
'
Image Height
'
,
blank
=
True
,
null
=
True
,
editable
=
False
)
width
=
models
.
PositiveIntegerField
(
'
Image Width
'
,
blank
=
True
,
null
=
True
,
editable
=
False
)
image
=
VersatileImageField
(
_
(
"
Featured image
"
),
blank
=
True
,
null
=
True
,
upload_to
=
'
note_images
'
,
width_field
=
'
width
'
,
height_field
=
'
height
'
,
ppoi_field
=
'
ppoi
'
)
status
=
models
.
IntegerField
(
_
(
"
Status
"
),
choices
=
STATUS_CHOICES
,
default
=
1
)
timeslot
=
models
.
OneToOneField
(
TimeSlot
,
on_delete
=
models
.
CASCADE
,
unique
=
True
)
title
=
models
.
CharField
(
max_length
=
128
)
slug
=
models
.
SlugField
(
max_length
=
32
,
unique
=
True
)
summary
=
models
.
TextField
(
blank
=
True
)
content
=
models
.
TextField
()
ppoi
=
PPOIField
()
height
=
models
.
PositiveIntegerField
(
blank
=
True
,
null
=
True
,
editable
=
False
)
width
=
models
.
PositiveIntegerField
(
blank
=
True
,
null
=
True
,
editable
=
False
)
image
=
VersatileImageField
(
blank
=
True
,
null
=
True
,
upload_to
=
'
note_images
'
,
width_field
=
'
width
'
,
height_field
=
'
height
'
,
ppoi_field
=
'
ppoi
'
)
status
=
models
.
IntegerField
(
default
=
1
)
start
=
models
.
DateTimeField
(
editable
=
False
)
show
=
models
.
ForeignKey
(
Show
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
notes
'
,
editable
=
True
)
cba_id
=
models
.
IntegerField
(
_
(
"
CBA ID
"
),
blank
=
True
,
null
=
True
)
audio_url
=
models
.
TextField
(
_
(
"
Direct URL to a linked audio file
"
),
blank
=
True
,
editable
=
False
)
cba_id
=
models
.
IntegerField
(
blank
=
True
,
null
=
True
)
audio_url
=
models
.
TextField
(
blank
=
True
,
editable
=
False
)
created
=
models
.
DateTimeField
(
auto_now_add
=
True
,
editable
=
False
)
last_updated
=
models
.
DateTimeField
(
auto_now
=
True
,
editable
=
False
)
user
=
models
.
ForeignKey
(
User
,
editable
=
False
,
on_delete
=
models
.
CASCADE
,
related_name
=
'
users
'
,
default
=
1
)
...
...
@@ -1034,11 +925,6 @@ class Note(models.Model):
class
Meta
:
ordering
=
(
'
timeslot
'
,)
verbose_name
=
_
(
"
Note
"
)
verbose_name_plural
=
_
(
"
Notes
"
)
def
__str__
(
self
):
return
'
%s - %s
'
%
(
self
.
title
,
self
.
timeslot
)
def
save
(
self
,
*
args
,
**
kwargs
):
self
.
start
=
self
.
timeslot
.
start
...
...
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