Improve launderette plannings

This commit is contained in:
Skia 2016-07-29 01:38:46 +02:00
parent a01fc63a82
commit ef17e66351
11 changed files with 201 additions and 133 deletions

View File

@ -1,3 +1,9 @@
from django.contrib import admin from django.contrib import admin
from launderette.models import *
# Register your models here. # Register your models here.
admin.site.register(Launderette)
admin.site.register(Machine)
admin.site.register(Token)
admin.site.register(Slot)

View File

@ -1,47 +0,0 @@
# -*- 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',
},
),
]

View File

@ -0,0 +1,66 @@
# -*- 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'),
),
]

View File

@ -1,39 +0,0 @@
# -*- 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'),
),
]

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('launderette', '0001_squashed_0006_auto_20160729_0050'),
]
operations = [
migrations.AlterModelOptions(
name='slot',
options={'verbose_name': 'Slot'},
),
]

View File

@ -1,20 +0,0 @@
# -*- 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'),
),
]

View File

@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('launderette', '0003_launderette_sellers'),
]
operations = [
migrations.AlterField(
model_name='launderette',
name='sellers',
field=models.ManyToManyField(blank=True, to='subscription.Subscriber', verbose_name='sellers', related_name='launderettes'),
),
]

View File

@ -48,6 +48,9 @@ class Machine(models.Model):
return True return True
return False return False
def __str__(self):
return "%s - Launderette: %s - Working: %s" % (self.name, self.launderette, self.is_working)
class Token(models.Model): class Token(models.Model):
name = models.IntegerField(_('name')) name = models.IntegerField(_('name'))
launderette = models.ForeignKey(Launderette, related_name='tokens', verbose_name=_('launderette')) launderette = models.ForeignKey(Launderette, related_name='tokens', verbose_name=_('launderette'))
@ -68,9 +71,16 @@ class Slot(models.Model):
start_date = models.DateTimeField(_('start date')) start_date = models.DateTimeField(_('start date'))
type = models.CharField(_('type'), max_length=10, choices=[('WASHING', _('Washing')), ('DRYING', _('Drying'))]) type = models.CharField(_('type'), max_length=10, choices=[('WASHING', _('Washing')), ('DRYING', _('Drying'))])
machine = models.ForeignKey(Machine, related_name='slots', verbose_name=_('machine')) 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')) user = models.ForeignKey(Subscriber, related_name='slots', verbose_name=_('user'))
class Meta:
verbose_name = _('Slot')
def full_clean(self): def full_clean(self):
return super(Slot, self).full_clean() return super(Slot, self).full_clean()
def __str__(self):
return str(self.user) + " - " + str(self.start_date)

View File

@ -4,13 +4,38 @@
{% trans %}Launderette{% endtrans %} {% trans %}Launderette{% endtrans %}
{% endblock %} {% 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 %} {% block content %}
{% if request.user.is_in_group(settings.SITH_MAIN_MEMBERS_GROUP) %} {% if request.user.is_in_group(settings.SITH_MAIN_MEMBERS_GROUP) %}
<ul> <table>
{% for l in launderette_list %} <thead>
<li><a href="{{ url('launderette:book_slot', launderette_id=l.id) }}">{{ l }}</a></li> <tr>
{% for day in planning.keys() %}
<th>{{ day|date('l') }}</th>
{% endfor %} {% endfor %}
</ul> </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 %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -0,0 +1,21 @@
{% 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 %}

View File

@ -1,14 +1,20 @@
from datetime import datetime, timedelta
from collections import OrderedDict
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import ListView, DetailView, RedirectView, TemplateView from django.views.generic import ListView, DetailView, RedirectView, TemplateView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, ProcessFormView, FormMixin from django.views.generic.edit import UpdateView, CreateView, DeleteView, ProcessFormView, FormMixin
from django.forms.models import modelform_factory from django.forms.models import modelform_factory
from django.forms import CheckboxSelectMultiple from django.forms import CheckboxSelectMultiple
from django.utils.translation import ugettext as _ 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 django.conf import settings
from core.models import Page from core.models import Page
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin
from launderette.models import Launderette, Token, Machine, Slot from launderette.models import Launderette, Token, Machine, Slot
from subscription.views import get_subscriber
# For users # For users
@ -25,14 +31,55 @@ class LaunderetteMainView(TemplateView):
class LaunderetteBookMainView(CanViewMixin, ListView): class LaunderetteBookMainView(CanViewMixin, ListView):
"""Choose which launderette to book""" """Choose which launderette to book"""
model = Launderette model = Launderette
template_name = 'launderette/launderette_book.jinja' template_name = 'launderette/launderette_book_choose.jinja'
class LaunderetteBookView(TemplateView): class LaunderetteBookView(DetailView):
"""Display the launderette schedule""" """Display the launderette schedule"""
model = Launderette model = Launderette
pk_url_kwarg = "launderette_id" pk_url_kwarg = "launderette_id"
template_name = 'launderette/launderette_book.jinja' 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 # For admins