Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
AE UTBM
Sith
Commits
ef17e663
Commit
ef17e663
authored
Jul 29, 2016
by
Skia
🤘
Browse files
Improve launderette plannings
parent
a01fc63a
Pipeline
#78
failed with stage
in 1 minute and 59 seconds
Changes
10
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
launderette/admin.py
View file @
ef17e663
from
django.contrib
import
admin
from
launderette.models
import
*
# Register your models here.
admin
.
site
.
register
(
Launderette
)
admin
.
site
.
register
(
Machine
)
admin
.
site
.
register
(
Token
)
admin
.
site
.
register
(
Slot
)
launderette/migrations/0001_initial.py
deleted
100644 → 0
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
]
operations
=
[
migrations
.
CreateModel
(
name
=
'Launderette'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'name'
)),
],
options
=
{
'verbose_name'
:
'Launderette'
,
},
),
migrations
.
CreateModel
(
name
=
'Machine'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'name'
)),
(
'is_working'
,
models
.
BooleanField
(
default
=
True
,
verbose_name
=
'is working'
)),
(
'launderette'
,
models
.
ForeignKey
(
to
=
'launderette.Launderette'
,
related_name
=
'machines'
,
verbose_name
=
'launderette'
)),
],
options
=
{
'verbose_name'
:
'Machine'
,
},
),
migrations
.
CreateModel
(
name
=
'Token'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
serialize
=
False
,
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
)),
(
'name'
,
models
.
CharField
(
max_length
=
30
,
verbose_name
=
'name'
)),
(
'type'
,
models
.
CharField
(
choices
=
[(
'WASHING'
,
'Washing'
),
(
'DRYING'
,
'Drying'
)],
max_length
=
10
,
verbose_name
=
'type'
)),
(
'launderette'
,
models
.
ForeignKey
(
to
=
'launderette.Launderette'
,
related_name
=
'tokens'
,
verbose_name
=
'launderette'
)),
],
options
=
{
'verbose_name'
:
'Token'
,
},
),
]
launderette/migrations/0001_squashed_0006_auto_20160729_0050.py
0 → 100644
View file @
ef17e663
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
replaces
=
[(
'launderette'
,
'0001_initial'
),
(
'launderette'
,
'0002_auto_20160728_1858'
),
(
'launderette'
,
'0003_launderette_sellers'
),
(
'launderette'
,
'0004_auto_20160728_1922'
),
(
'launderette'
,
'0005_auto_20160729_0049'
),
(
'launderette'
,
'0006_auto_20160729_0050'
)]
dependencies
=
[
(
'subscription'
,
'0002_auto_20160718_1805'
),
]
operations
=
[
migrations
.
CreateModel
(
name
=
'Launderette'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
,
serialize
=
False
)),
(
'name'
,
models
.
CharField
(
verbose_name
=
'name'
,
max_length
=
30
)),
],
options
=
{
'verbose_name'
:
'Launderette'
,
},
),
migrations
.
CreateModel
(
name
=
'Machine'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
,
serialize
=
False
)),
(
'name'
,
models
.
CharField
(
verbose_name
=
'name'
,
max_length
=
30
)),
(
'is_working'
,
models
.
BooleanField
(
verbose_name
=
'is working'
,
default
=
True
)),
(
'launderette'
,
models
.
ForeignKey
(
related_name
=
'machines'
,
verbose_name
=
'launderette'
,
to
=
'launderette.Launderette'
)),
],
options
=
{
'verbose_name'
:
'Machine'
,
},
),
migrations
.
CreateModel
(
name
=
'Token'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
,
serialize
=
False
)),
(
'name'
,
models
.
IntegerField
(
verbose_name
=
'name'
)),
(
'type'
,
models
.
CharField
(
verbose_name
=
'type'
,
choices
=
[(
'WASHING'
,
'Washing'
),
(
'DRYING'
,
'Drying'
)],
max_length
=
10
)),
(
'launderette'
,
models
.
ForeignKey
(
related_name
=
'tokens'
,
verbose_name
=
'launderette'
,
to
=
'launderette.Launderette'
)),
],
options
=
{
'verbose_name'
:
'Token'
,
},
),
migrations
.
CreateModel
(
name
=
'Slot'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
auto_created
=
True
,
verbose_name
=
'ID'
,
primary_key
=
True
,
serialize
=
False
)),
(
'start_date'
,
models
.
DateTimeField
(
verbose_name
=
'start date'
)),
(
'type'
,
models
.
CharField
(
verbose_name
=
'type'
,
choices
=
[(
'WASHING'
,
'Washing'
),
(
'DRYING'
,
'Drying'
)],
max_length
=
10
)),
(
'machine'
,
models
.
ForeignKey
(
related_name
=
'slots'
,
verbose_name
=
'machine'
,
to
=
'launderette.Machine'
)),
(
'token'
,
models
.
ForeignKey
(
related_name
=
'slots'
,
null
=
True
,
verbose_name
=
'token'
,
blank
=
True
,
to
=
'launderette.Token'
)),
(
'user'
,
models
.
ForeignKey
(
related_name
=
'slots'
,
verbose_name
=
'user'
,
to
=
'subscription.Subscriber'
)),
],
),
migrations
.
AddField
(
model_name
=
'launderette'
,
name
=
'sellers'
,
field
=
models
.
ManyToManyField
(
verbose_name
=
'sellers'
,
related_name
=
'launderettes'
,
blank
=
True
,
to
=
'subscription.Subscriber'
),
),
]
launderette/migrations/0002_auto_20160728_1858.py
deleted
100644 → 0
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'subscription'
,
'0002_auto_20160718_1805'
),
(
'launderette'
,
'0001_initial'
),
]
operations
=
[
migrations
.
CreateModel
(
name
=
'Slot'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
primary_key
=
True
,
serialize
=
False
,
verbose_name
=
'ID'
,
auto_created
=
True
)),
(
'start_date'
,
models
.
DateTimeField
(
verbose_name
=
'start date'
)),
(
'type'
,
models
.
CharField
(
max_length
=
10
,
verbose_name
=
'type'
,
choices
=
[(
'WASHING'
,
'Washing'
),
(
'DRYING'
,
'Drying'
)])),
(
'machine'
,
models
.
ForeignKey
(
verbose_name
=
'machine'
,
related_name
=
'slots'
,
to
=
'launderette.Machine'
)),
],
),
migrations
.
AlterField
(
model_name
=
'token'
,
name
=
'name'
,
field
=
models
.
IntegerField
(
verbose_name
=
'name'
),
),
migrations
.
AddField
(
model_name
=
'slot'
,
name
=
'token'
,
field
=
models
.
ForeignKey
(
verbose_name
=
'token'
,
related_name
=
'slots'
,
to
=
'launderette.Token'
),
),
migrations
.
AddField
(
model_name
=
'slot'
,
name
=
'user'
,
field
=
models
.
ForeignKey
(
verbose_name
=
'user'
,
related_name
=
'slots'
,
to
=
'subscription.Subscriber'
),
),
]
launderette/migrations/000
4
_auto_2016072
8_1922
.py
→
launderette/migrations/000
2
_auto_2016072
9_0138
.py
View file @
ef17e663
...
...
@@ -7,13 +7,12 @@ from django.db import migrations, models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'launderette'
,
'000
3_launderette_sellers
'
),
(
'launderette'
,
'000
1_squashed_0006_auto_20160729_0050
'
),
]
operations
=
[
migrations
.
AlterField
(
model_name
=
'launderette'
,
name
=
'sellers'
,
field
=
models
.
ManyToManyField
(
blank
=
True
,
to
=
'subscription.Subscriber'
,
verbose_name
=
'sellers'
,
related_name
=
'launderettes'
),
migrations
.
AlterModelOptions
(
name
=
'slot'
,
options
=
{
'verbose_name'
:
'Slot'
},
),
]
launderette/migrations/0003_launderette_sellers.py
deleted
100644 → 0
View file @
a01fc63a
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'subscription'
,
'0002_auto_20160718_1805'
),
(
'launderette'
,
'0002_auto_20160728_1858'
),
]
operations
=
[
migrations
.
AddField
(
model_name
=
'launderette'
,
name
=
'sellers'
,
field
=
models
.
ManyToManyField
(
to
=
'subscription.Subscriber'
,
verbose_name
=
'sellers'
,
related_name
=
'launderettes'
),
),
]
launderette/models.py
View file @
ef17e663
...
...
@@ -48,6 +48,9 @@ class Machine(models.Model):
return
True
return
False
def
__str__
(
self
):
return
"%s - Launderette: %s - Working: %s"
%
(
self
.
name
,
self
.
launderette
,
self
.
is_working
)
class
Token
(
models
.
Model
):
name
=
models
.
IntegerField
(
_
(
'name'
))
launderette
=
models
.
ForeignKey
(
Launderette
,
related_name
=
'tokens'
,
verbose_name
=
_
(
'launderette'
))
...
...
@@ -68,9 +71,16 @@ class Slot(models.Model):
start_date
=
models
.
DateTimeField
(
_
(
'start date'
))
type
=
models
.
CharField
(
_
(
'type'
),
max_length
=
10
,
choices
=
[(
'WASHING'
,
_
(
'Washing'
)),
(
'DRYING'
,
_
(
'Drying'
))])
machine
=
models
.
ForeignKey
(
Machine
,
related_name
=
'slots'
,
verbose_name
=
_
(
'machine'
))
token
=
models
.
ForeignKey
(
Token
,
related_name
=
'slots'
,
verbose_name
=
_
(
'token'
))
token
=
models
.
ForeignKey
(
Token
,
related_name
=
'slots'
,
verbose_name
=
_
(
'token'
)
,
blank
=
True
,
null
=
True
)
user
=
models
.
ForeignKey
(
Subscriber
,
related_name
=
'slots'
,
verbose_name
=
_
(
'user'
))
class
Meta
:
verbose_name
=
_
(
'Slot'
)
def
full_clean
(
self
):
return
super
(
Slot
,
self
).
full_clean
()
def
__str__
(
self
):
return
str
(
self
.
user
)
+
" - "
+
str
(
self
.
start_date
)
launderette/templates/launderette/launderette_book.jinja
View file @
ef17e663
...
...
@@ -4,13 +4,38 @@
{%
trans
%}
Launderette
{%
endtrans
%}
{%
endblock
%}
{%
macro
choose
(
date
)
%}
<form
method=
"post"
action=
"
{{
url
(
'launderette:book_slot'
,
launderette_id
=
launderette.id
)
}}
"
class=
"inline"
style=
"display:inline"
>
{%
csrf_token
%}
<button
type=
"submit"
name=
"slot"
value=
"
{{
localtime
(
date
)
.
isoformat
()
}}
"
>
{%
trans
%}
Choose
{%
endtrans
%}
</button>
</form>
{%
endmacro
%}
{%
block
content
%}
{%
if
request.user.is_in_group
(
settings.SITH_MAIN_MEMBERS_GROUP
)
%}
<ul>
{%
for
l
in
launderette_list
%}
<li><a
href=
"
{{
url
(
'launderette:book_slot'
,
launderette_id
=
l.id
)
}}
"
>
{{
l
}}
</a></li>
{%
endfor
%}
</ul>
<table>
<thead>
<tr>
{%
for
day
in
planning.keys
()
%}
<th>
{{
day
|
date
(
'l'
)
}}
</th>
{%
endfor
%}
</tr>
</thead>
<tbody>
{%
for
i
in
range
(
0
,
24
)
%}
<tr>
{%
for
hours
in
planning.values
()
%}
<td>
{%
if
hours
[
i
]
%}
{{
hours
[
i
]
|
localtime
|
time
(
TIME_FORMAT
)
}}
{{
choose
(
hours
[
i
])
}}
{%
endif
%}
</td>
{%
endfor
%}
</tr>
{%
endfor
%}
</tbody>
</table>
{%
endif
%}
{%
endblock
%}
...
...
launderette/templates/launderette/launderette_book_choose.jinja
0 → 100644
View file @
ef17e663
{%
extends
"core/base.jinja"
%}
{%
block
title
%}
{%
trans
%}
Launderette
{%
endtrans
%}
{%
endblock
%}
{%
block
content
%}
{%
if
request.user.is_in_group
(
settings.SITH_MAIN_MEMBERS_GROUP
)
%}
<ul>
{%
for
l
in
launderette_list
%}
<li><a
href=
"
{{
url
(
'launderette:book_slot'
,
launderette_id
=
l.id
)
}}
"
>
{{
l
}}
</a></li>
{%
endfor
%}
</ul>
{%
endif
%}
{%
endblock
%}
launderette/views.py
View file @
ef17e663
from
datetime
import
datetime
,
timedelta
from
collections
import
OrderedDict
from
django.shortcuts
import
render
from
django.views.generic
import
ListView
,
DetailView
,
RedirectView
,
TemplateView
from
django.views.generic.edit
import
UpdateView
,
CreateView
,
DeleteView
,
ProcessFormView
,
FormMixin
from
django.forms.models
import
modelform_factory
from
django.forms
import
CheckboxSelectMultiple
from
django.utils.translation
import
ugettext
as
_
from
django.utils.timezone
import
make_aware
from
django.utils
import
dateparse
from
django.conf
import
settings
from
core.models
import
Page
from
core.views
import
CanViewMixin
,
CanEditMixin
,
CanEditPropMixin
,
CanCreateMixin
from
launderette.models
import
Launderette
,
Token
,
Machine
,
Slot
from
subscription.views
import
get_subscriber
# For users
...
...
@@ -25,14 +31,55 @@ class LaunderetteMainView(TemplateView):
class
LaunderetteBookMainView
(
CanViewMixin
,
ListView
):
"""Choose which launderette to book"""
model
=
Launderette
template_name
=
'launderette/launderette_book.jinja'
template_name
=
'launderette/launderette_book
_choose
.jinja'
class
LaunderetteBookView
(
Template
View
):
class
LaunderetteBookView
(
Detail
View
):
"""Display the launderette schedule"""
model
=
Launderette
pk_url_kwarg
=
"launderette_id"
template_name
=
'launderette/launderette_book.jinja'
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
object
=
self
.
get_object
()
if
'slot'
in
request
.
POST
.
keys
()
and
request
.
user
.
is_authenticated
():
subscriber
=
get_subscriber
(
request
.
user
)
if
subscriber
.
is_subscribed
():
date
=
dateparse
.
parse_datetime
(
request
.
POST
[
'slot'
])
for
m
in
self
.
object
.
machines
.
filter
(
is_working
=
True
).
all
():
slot
=
Slot
.
objects
.
filter
(
start_date
=
date
,
machine
=
m
).
first
()
print
(
slot
)
if
slot
is
None
:
Slot
(
user
=
subscriber
,
start_date
=
date
,
machine
=
m
,
type
=
"WASHING"
).
save
()
print
(
"Saved"
)
break
return
super
(
LaunderetteBookView
,
self
).
get
(
request
,
*
args
,
**
kwargs
)
@
staticmethod
def
date_iterator
(
startDate
,
endDate
,
delta
=
timedelta
(
days
=
1
)):
currentDate
=
startDate
while
currentDate
<
endDate
:
yield
currentDate
currentDate
+=
delta
def
get_context_data
(
self
,
**
kwargs
):
""" Add page to the context """
kwargs
=
super
(
LaunderetteBookView
,
self
).
get_context_data
(
**
kwargs
)
kwargs
[
'planning'
]
=
OrderedDict
()
start_date
=
make_aware
(
datetime
.
now
().
replace
(
hour
=
0
,
minute
=
0
,
second
=
0
,
microsecond
=
0
))
for
date
in
LaunderetteBookView
.
date_iterator
(
start_date
,
start_date
+
timedelta
(
days
=
6
),
timedelta
(
days
=
1
)):
kwargs
[
'planning'
][
date
]
=
[]
for
h
in
LaunderetteBookView
.
date_iterator
(
date
,
date
+
timedelta
(
days
=
1
),
timedelta
(
hours
=
1
)):
free
=
False
for
m
in
self
.
object
.
machines
.
filter
(
is_working
=
True
).
all
():
s
=
Slot
.
objects
.
filter
(
start_date
=
h
,
machine
=
m
).
first
()
if
s
is
None
:
free
=
True
if
free
and
make_aware
(
datetime
.
now
())
<
h
:
kwargs
[
'planning'
][
date
].
append
(
h
)
else
:
kwargs
[
'planning'
][
date
].
append
(
None
)
print
(
"Taken"
)
return
kwargs
# For admins
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment