added new_stay route and form 0 for boat search
This commit is contained in:
commit
951a325293
12
doc/gpp_todo
12
doc/gpp_todo
|
@ -5,3 +5,15 @@ TODO :
|
|||
- how to determine which is the right person if choosing from a list and two
|
||||
have the same names (rare) :
|
||||
name surname - city (country)
|
||||
|
||||
Pour la partie NEW ARRIVAL:
|
||||
|
||||
- séparer chaque form:
|
||||
séparer company_form, insurance_form, person_form, address_form, stay_form, mooring_form de boat_form
|
||||
|
||||
- une url pour:
|
||||
-boat_form
|
||||
-company_form, insurance_form, (address_form)
|
||||
-person_form, (address_form)
|
||||
-stay_form, mooring_form
|
||||
|
||||
|
|
|
@ -1,49 +1,55 @@
|
|||
HOME:
|
||||
- NEW STAY
|
||||
- NEW PAYMENT
|
||||
|
||||
|
||||
NEW STAY
|
||||
|
||||
- enter boat name:
|
||||
- list of existing boats with same/similar name: choose one
|
||||
or
|
||||
- add a new boat: boat form
|
||||
NEXT
|
||||
|
||||
- same insurance?:
|
||||
- yes
|
||||
or
|
||||
- no:
|
||||
- enter company(insurance) name:
|
||||
- list of existing companies with same/similar name: choose one
|
||||
or
|
||||
- add a new company: company form
|
||||
|
||||
NEXT
|
||||
|
||||
- persons:
|
||||
- list of persons on this boat in the past:
|
||||
- edit
|
||||
- checkbox: is 'captain', 'crew', etc, during this stay
|
||||
- add new person: person form
|
||||
|
||||
NEXT
|
||||
|
||||
- stay: stay form (add number of passengers)
|
||||
|
||||
SAVE
|
||||
|
||||
NEW PAYMENT
|
||||
|
||||
- list of current stays: select one
|
||||
|
||||
NEXT
|
||||
|
||||
- bill: bill form
|
||||
- number of nights:
|
||||
- calculated if there is a departure date
|
||||
or
|
||||
- enter a number if no departure date
|
||||
- shower
|
||||
HOME:
|
||||
- NEW STAY
|
||||
- NEW PAYMENT
|
||||
- FIND/EDIT STAY
|
||||
- FIND/EDIT BOAT
|
||||
- FIND/EDIT PERSON
|
||||
- NEW PORT
|
||||
- FIND/EDIT PORT
|
||||
- SCHEDULE
|
||||
- ACCOUNTING: FIND PAYMENT
|
||||
|
||||
NEW STAY
|
||||
|
||||
- enter boat name:
|
||||
- list of existing boats with same/similar name: choose one
|
||||
or
|
||||
- add a new boat: boat form
|
||||
NEXT
|
||||
|
||||
- same insurance?:
|
||||
- yes
|
||||
or
|
||||
- no:
|
||||
- enter company(insurance) name:
|
||||
- list of existing companies with same/similar name: choose one
|
||||
or
|
||||
- add a new company: company form
|
||||
|
||||
NEXT
|
||||
|
||||
- persons:
|
||||
- list of persons on this boat in the past:
|
||||
- edit
|
||||
- checkbox: is 'captain', 'crew', etc, during this stay
|
||||
- add new person: person form
|
||||
|
||||
NEXT
|
||||
|
||||
- stay: stay form (add number of passengers)
|
||||
|
||||
SAVE
|
||||
|
||||
NEW PAYMENT
|
||||
|
||||
- list of current stays: select one
|
||||
|
||||
NEXT
|
||||
|
||||
- bill: bill form
|
||||
- number of nights:
|
||||
- calculated if there is a departure date
|
||||
or
|
||||
- enter a number if no departure date
|
||||
- shower
|
||||
- water: number of tons used for passenger boats
|
|
@ -128,3 +128,5 @@ STATIC_URL = '/static/'
|
|||
STATICFILES_DIRS = [
|
||||
os.path.join(BASE_DIR, "static")
|
||||
]
|
||||
|
||||
## CUSTOM CONF
|
||||
|
|
|
@ -17,7 +17,7 @@ from django.contrib import admin
|
|||
from django.urls import include, path
|
||||
|
||||
urlpatterns = [
|
||||
#path('', include('port.urls', namespace='index')),
|
||||
path('', include('port.urls.index', namespace='index')),
|
||||
path('port/', include('port.urls.port', namespace='port')),
|
||||
path('person/', include('port.urls.person', namespace='person')),
|
||||
path('boat/', include('port.urls.boat', namespace='boat')),
|
||||
|
|
6
gpp_todo
6
gpp_todo
|
@ -1,6 +0,0 @@
|
|||
TODO :
|
||||
- see if we can add a person in a Mooring (problem if the boat fleets
|
||||
changes between two moorings)
|
||||
- how to determine which is the right person if choosing from a list and two
|
||||
have the same names (rare)
|
||||
|
|
@ -1,11 +1,15 @@
|
|||
from django.forms import Form, ModelForm, \
|
||||
CharField, IntegerField, DecimalField, \
|
||||
CharField, IntegerField, DecimalField, ChoiceField,\
|
||||
BooleanField, EmailField, DateTimeField, ImageField, \
|
||||
formset_factory, SelectDateWidget
|
||||
from django_countries.fields import CountryField
|
||||
from phonenumber_field.formfields import PhoneNumberField
|
||||
formset_factory, SelectDateWidget, TextInput, \
|
||||
RadioSelect
|
||||
|
||||
from django_countries.fields import CountryField
|
||||
from phonenumber_field.formfields import PhoneNumberField
|
||||
from .models import Address, Person, Company, Insurance, Boat, \
|
||||
SailsOn, BoatInsurance, Port, Employee, Dock, Plug, Tap, \
|
||||
Payment, Service, Bill, BillLine, BillPayment, Stay, Mooring
|
||||
|
||||
from .models import *
|
||||
|
||||
class AddressForm(ModelForm):
|
||||
class Meta:
|
||||
|
@ -55,6 +59,22 @@ class InsuranceForm(CompanyForm):
|
|||
'name']
|
||||
|
||||
|
||||
class BoatSearchForm(Form):
|
||||
search_name = CharField(
|
||||
label='Name'
|
||||
)
|
||||
search_results = ChoiceField(
|
||||
label='Boats',
|
||||
widget=RadioSelect
|
||||
)
|
||||
|
||||
def __init__(self, name='', choices=[]):
|
||||
super(Form, self).__init__()
|
||||
print(name)
|
||||
self.fields['search_name'].initial = name
|
||||
self.fields['search_results'].choices = choices
|
||||
|
||||
|
||||
class BoatForm(ModelForm):
|
||||
class Meta:
|
||||
model = Boat
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
TODO :
|
||||
- see if we can add a person in a Mooring (problem if the boat fleets
|
||||
changes between two moorings)
|
||||
- how to determine which is the right person if choosing from a list and two
|
||||
have the same names (rare)
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
# Generated by Django 2.2.1 on 2019-06-22 17:46
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import port.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('port', '0003_auto_20190608_1839'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sailson',
|
||||
name='present',
|
||||
field=models.BooleanField(default=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='address',
|
||||
name='address',
|
||||
field=models.CharField(default='miss_add', max_length=200),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='address',
|
||||
name='city',
|
||||
field=models.CharField(default='miss_city', max_length=200),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='address',
|
||||
name='zip_code',
|
||||
field=models.CharField(default='miss_zip', max_length=10),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='boat',
|
||||
name='beam',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='boat',
|
||||
name='boat_insurance',
|
||||
field=models.ManyToManyField(blank=True, through='port.BoatInsurance', to='port.Insurance'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='boat',
|
||||
name='length',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive], verbose_name='Length'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='boat',
|
||||
name='tonnage',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='boat',
|
||||
name='water_draught',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='boat',
|
||||
name='water_tank',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive], verbose_name='Water tank capacity'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='company',
|
||||
name='name',
|
||||
field=models.CharField(blank=True, max_length=50),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dock',
|
||||
name='depth_max',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dock',
|
||||
name='depth_min',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dock',
|
||||
name='length',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dock',
|
||||
name='width',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='employee',
|
||||
name='port',
|
||||
field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.PROTECT, to='port.Port'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='plug',
|
||||
name='amperage',
|
||||
field=models.DecimalField(decimal_places=2, max_digits=7, validators=[port.models.validate_positive]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='plug',
|
||||
name='voltage',
|
||||
field=models.DecimalField(decimal_places=2, max_digits=7, validators=[port.models.validate_positive]),
|
||||
),
|
||||
]
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
<link rel="stylesheet" href="{% static "css/normalize.css" %}">
|
||||
<link rel="stylesheet" href="{% static "css/skeleton.css" %}">
|
||||
<link rel="stylesheet" href="{% static "css/gpp.css" %}">
|
||||
|
||||
<link rel="icon" type="image/png" href="{% static "images/favicon.png" %}">
|
||||
<!--
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<form action="{% url 'index:new_stay' %}"
|
||||
method="post">
|
||||
{% csrf_token %}
|
||||
{% block form %}
|
||||
<a href="{% url 'index:new_stay' %}">New Stay</a>
|
||||
{% endblock %}
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -0,0 +1,10 @@
|
|||
{% extends "index.html" %}
|
||||
{% block form %}
|
||||
<div class="search" id="search_boat">
|
||||
{{ boat_search_form }}
|
||||
</div>
|
||||
<div class="new hidden" id="new_boat">
|
||||
<!-- {{ boat_form }} -->
|
||||
</div>
|
||||
<input type="submit" value="Submit" />
|
||||
{% endblock %}
|
|
@ -5,4 +5,5 @@ from .views.index import *
|
|||
app_name = 'index'
|
||||
urlpatterns = [
|
||||
path('', index, name='index'),
|
||||
path('/new_stay', new_stay, name='new_stay'),
|
||||
]
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
from django.urls import path
|
||||
|
||||
from ..views.index import *
|
||||
|
||||
app_name = 'index'
|
||||
urlpatterns = [
|
||||
path('', index, name='index'),
|
||||
path('new_stay/', new_stay, name='new_stay'),
|
||||
]
|
|
@ -1,17 +1,51 @@
|
|||
from django.shortcuts import render
|
||||
from django.http import HttpResponse
|
||||
from django.conf import settings
|
||||
from django.forms import TextInput, RadioSelect
|
||||
|
||||
from pprint import pprint
|
||||
|
||||
from ..models import *
|
||||
from ..forms import *
|
||||
import ..views as Views
|
||||
#import ..views as Views
|
||||
|
||||
def index(request):
|
||||
return HttpResponse("Hello World")
|
||||
return render(request, 'index.html')
|
||||
|
||||
def index_port(request):
|
||||
return Views.port.index(request)
|
||||
def new_stay(request):
|
||||
if not request.session.get('new_stay_step', False) \
|
||||
or request.session.get('new_stay_done', False) :
|
||||
# This is a new stay, we initialize the session
|
||||
request.session['new_stay_step'] = 0
|
||||
request.session['new_stay_done'] = False
|
||||
|
||||
def index_person(request):
|
||||
return Views.person.index(request)
|
||||
name = request.POST.get('search_name', '')
|
||||
boat_existing = [ (b.id, b.name) for b in \
|
||||
Boat.objects.filter(name__icontains=name) ]
|
||||
pprint(boat_existing)
|
||||
boat_search_form = BoatSearchForm(
|
||||
name=name,
|
||||
choices=boat_existing)
|
||||
boat_form = BoatForm()
|
||||
|
||||
|
||||
return render(request,
|
||||
'new_stay/new_stay-0.html',
|
||||
{
|
||||
'boat_search_form': boat_search_form,
|
||||
'boat_form': boat_form
|
||||
})
|
||||
# Boat form
|
||||
elif request.session['new_stay_step'] == 1:
|
||||
# Insurance form
|
||||
return render(request, 'new_stay-1.html')
|
||||
elif request.session['new_stay_step'] ==2:
|
||||
# Person form
|
||||
return render(request, 'new_stay-2.html')
|
||||
elif request.session['new_stay_step'] ==3:
|
||||
# Stay form
|
||||
return render(request, 'new_stay-3.html')
|
||||
elif request.session['new_stay_step'] == 4:
|
||||
# Save form
|
||||
request.session['new_stay_done'] = True
|
||||
return render(request, 'new_stay-4.html')
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
"""gpp URL Configuration
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/2.2/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import include, path
|
||||
|
||||
urlpatterns = [
|
||||
#path('', include('port.urls', namespace='index')),
|
||||
path('port/', include('port.urls.port', namespace='port')),
|
||||
path('person/', include('port.urls.person', namespace='person')),
|
||||
path('boat/', include('port.urls.boat', namespace='boat')),
|
||||
path('admin/', admin.site.urls),
|
||||
]
|
|
@ -0,0 +1,49 @@
|
|||
from django.shortcuts import render
|
||||
from django.http import HttpResponse
|
||||
|
||||
from pprint import pprint
|
||||
|
||||
from .models import *
|
||||
from .forms import *
|
||||
|
||||
def index(request):
|
||||
return HttpResponse("Hello, world.")
|
||||
|
||||
def ports_status(request):
|
||||
"""
|
||||
res = ''
|
||||
ports = Port.objects.all()
|
||||
li = lambda x: '<li>' + str(x)
|
||||
res = ''.join(map(li, ports))
|
||||
res = '<html><body><ul>' + res + '</ul></body></html>'
|
||||
return HttpResponse(res)
|
||||
"""
|
||||
|
||||
return render(request, 'port/ports_status.html', {'ports': Port.objects})
|
||||
|
||||
def add_person(request):
|
||||
"""
|
||||
[GET] Renders the view to help people add persons
|
||||
[POST] Adds person
|
||||
"""
|
||||
forms = {'person':None, 'address':None}
|
||||
|
||||
if (request.method == 'POST'):
|
||||
forms.update({'person':PersonForm(request.POST)})
|
||||
if (forms.get('person').is_valid()):
|
||||
Person.objects.create(forms.get('person').cleaned_data)
|
||||
return list_persons(request)
|
||||
|
||||
# Address handlinG
|
||||
forms.update({'person':PersonForm(request.POST)})
|
||||
if (forms.get('person').is_valid()):
|
||||
Person.objects.create(forms.get('person').cleaned_data)
|
||||
return list_persons(request)
|
||||
|
||||
else:
|
||||
forms.update({'person':PersonForm()})
|
||||
|
||||
return render(request, 'person/add.html', {'form':forms})
|
||||
|
||||
def list_persons(request):
|
||||
return render(request, 'person/list.html', {'persons': Person.objects})
|
|
@ -0,0 +1,12 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<form action="{% url 'person:add' %}" method="post">
|
||||
{% csrf_token %}
|
||||
<fieldset>
|
||||
<!-- TO IMPLEMENT -->
|
||||
<legend>Person</legend>
|
||||
{{ form.person }}
|
||||
</fieldset>
|
||||
<input type="submit" value="add"/>
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -0,0 +1,9 @@
|
|||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<ul>
|
||||
<!-- TO IMPLEMENT -->
|
||||
{% for person in persons.all %}
|
||||
<li>{{ person }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
|
@ -0,0 +1,13 @@
|
|||
from django.urls import path
|
||||
|
||||
from ..views.person import *
|
||||
|
||||
app_name = 'person'
|
||||
urlpatterns = [
|
||||
path('', index, name='index'),
|
||||
path('list', list_persons, name='list'),
|
||||
path('form', form_person, name='form'),
|
||||
path('add', add_person, name='add'),
|
||||
|
||||
]
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
from django.shortcuts import render
|
||||
from django.http import HttpResponse
|
||||
|
||||
from pprint import pprint
|
||||
|
||||
from ..models import *
|
||||
from ..forms import *
|
||||
|
||||
def index(request):
|
||||
return HttpResponse("Hello Person")
|
||||
|
||||
def list_persons(request):
|
||||
# TO IMPLEMENT
|
||||
pass
|
||||
|
||||
def form_person(request):
|
||||
# TO IMPLEMENT
|
||||
pass
|
||||
|
||||
def add_person(request):
|
||||
# TO IMPLEMENT
|
||||
pass
|
|
@ -0,0 +1,7 @@
|
|||
.hidden {
|
||||
display : none;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type : none;
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
HOME:
|
||||
- NEW STAY
|
||||
- NEW PAYMENT
|
||||
|
||||
|
||||
NEW STAY
|
||||
|
||||
- enter boat name:
|
||||
- list of existing boats with same/similar name: choose one
|
||||
or
|
||||
- add a new boat: boat form
|
||||
NEXT
|
||||
|
||||
- same insurance?:
|
||||
- yes
|
||||
or
|
||||
- no:
|
||||
- enter company(insurance) name:
|
||||
- list of existing companies with same/similar name: choose one
|
||||
or
|
||||
- add a new company: company form
|
||||
|
||||
NEXT
|
||||
|
||||
- persons:
|
||||
- list of persons on this boat in the past:
|
||||
- edit
|
||||
- checkbox: is 'captain', 'crew', etc, during this stay
|
||||
- add new person: person form
|
||||
|
||||
NEXT
|
||||
|
||||
- stay: stay form (add number of passengers)
|
||||
|
||||
SAVE
|
||||
|
||||
NEW PAYMENT
|
||||
|
||||
- list of current stays: select one
|
||||
|
||||
NEXT
|
||||
|
||||
- bill: bill form
|
||||
- number of nights:
|
||||
- calculated if there is a departure date
|
||||
or
|
||||
- enter a number if no departure date
|
||||
- shower
|
||||
- water: number of tons used for passenger boats
|
Loading…
Reference in New Issue