Commit ef17e663 authored by Skia's avatar Skia
Browse files

Improve launderette plannings

parent a01fc63a
Pipeline #78 failed with stage
in 1 minute and 59 seconds
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)
# -*- 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',
},
),
]
# -*- 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'),
),
]
# -*- 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'),
),
]
......@@ -7,13 +7,12 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('launderette', '0003_launderette_sellers'),
('launderette', '0001_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'},
),
]
# -*- 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'),
),
]
......@@ -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)
......@@ -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 %}
......
{% 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 %}
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(TemplateView):
class LaunderetteBookView(DetailView):
"""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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment