diff --git a/smash/web/api_urls.py b/smash/web/api_urls.py new file mode 100644 index 0000000000000000000000000000000000000000..e2edbc6da7c9199ad5cc17d09248b854f640e080 --- /dev/null +++ b/smash/web/api_urls.py @@ -0,0 +1,24 @@ +"""smash URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.10/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from web import api_views + +urlpatterns = [ + url(r'cities$', api_views.cities, name='web.api.cities'), + url(r'countries$', api_views.countries, name='web.api.countries'), + url(r'specializations$', api_views.specializations, name='web.api.specializations'), + url(r'units$', api_views.units, name='web.api.units'), +] diff --git a/smash/web/api_views.py b/smash/web/api_views.py new file mode 100644 index 0000000000000000000000000000000000000000..2569471cd4400a8ee7e90effb75e42e18a244131 --- /dev/null +++ b/smash/web/api_views.py @@ -0,0 +1,31 @@ +from .models import * +from .forms import * + +from django.http import JsonResponse + +def cities(request): + X = Subject.objects.all().values_list('city').distinct() + return JsonResponse({ + "cities" : [x[0] for x in X] + }) + + +def countries(request): + X = Subject.objects.all().values_list('country').distinct() + return JsonResponse({ + "countries" : [x[0] for x in X] + }) + + +def specializations(request): + X = Worker.objects.all().values_list('specialization').distinct() + return JsonResponse({ + "specializations" : [x[0] for x in X] + }) + + +def units(request): + X = Worker.objects.all().values_list('unit').distinct() + return JsonResponse({ + "units" : [x[0] for x in X] + }) diff --git a/smash/web/templates/assignments/index.html b/smash/web/templates/assignments/index.html index e32aa2051683348bce4d5aa842555fd52fd056c9..f120849bf9ea2905af31d7ff68b3872115791b84 100644 --- a/smash/web/templates/assignments/index.html +++ b/smash/web/templates/assignments/index.html @@ -81,12 +81,12 @@ {{ approach.visit.subject.firstName }} {{ approach.visit.subject.lastName }} </td> <td> - <a href="{% url 'web.views.subjectdet' approach.visit.subject.id %}" type="button" class="btn btn-block btn-default">Subject's details</a> + <a href="{% url 'web.views.subject_details' approach.visit.subject.id %}" type="button" class="btn btn-block btn-default">Subject's details</a> </td> <td>{{ approach.appDateTime | date:"d-M-Y" }}</td> <td>{{ approach.appDateTime | time:"H:i" }}</td> <td> - <a href="{% url 'web.views.assignmentdetails' approach.id %}" type="button" class="btn btn-block btn-default">Details</a> + <a href="{% url 'web.views.assignment_details' approach.id %}" type="button" class="btn btn-block btn-default">Details</a> </td> </tr> {% endfor %} diff --git a/smash/web/templates/doctors/availdelete.html b/smash/web/templates/doctors/availability_delete.html similarity index 78% rename from smash/web/templates/doctors/availdelete.html rename to smash/web/templates/doctors/availability_delete.html index 932ac30c63a20014d2006c3cd6f6788a0b532d71..1a5cb9db5db3d288a5b4483f619f1778277fc0df 100644 --- a/smash/web/templates/doctors/availdelete.html +++ b/smash/web/templates/doctors/availability_delete.html @@ -36,7 +36,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -48,7 +48,7 @@ {% endif %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -70,7 +70,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -82,7 +82,7 @@ {% endif %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -104,7 +104,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -116,7 +116,7 @@ {% endif %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -138,7 +138,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -150,7 +150,7 @@ {% endif %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -172,7 +172,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -184,7 +184,7 @@ {% endif %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -206,7 +206,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -218,7 +218,7 @@ {% endif %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> diff --git a/smash/web/templates/doctors/availdex.html b/smash/web/templates/doctors/availability_index.html similarity index 81% rename from smash/web/templates/doctors/availdex.html rename to smash/web/templates/doctors/availability_index.html index b8a7922ce93fa1cefc0b299c74f7fbd531cebe3f..b8046fd1f52766a22377b488b739b409b8b5a904 100644 --- a/smash/web/templates/doctors/availdex.html +++ b/smash/web/templates/doctors/availability_index.html @@ -39,7 +39,7 @@ <h3>Monday</h3> <div class="new-availability"> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -60,7 +60,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -77,7 +77,7 @@ <h3>Tuesday</h3> <div class="new-availability"> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -98,7 +98,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -115,7 +115,7 @@ <h3>Wednesday</h3> <div class="new-availability"> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -136,7 +136,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -153,7 +153,7 @@ <h3>Thursday</h3> <div class="new-availability"> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -174,7 +174,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -191,7 +191,7 @@ <h3>Friday</h3> <div class="new-availability"> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -212,7 +212,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> @@ -229,7 +229,7 @@ <h3>Saturday</h3> <div class="new-availability"> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new avaibility</a> </div> @@ -250,7 +250,7 @@ <td> {{forloop.counter}} </td> <td> {{record.availFro}} </td> <td> {{record.availTil}} </td> - <td><a href="{% url 'web.views.availdelete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.doctor_availability_delete' id record.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} </tbody> diff --git a/smash/web/templates/doctors/index.html b/smash/web/templates/doctors/index.html index fd1d0d7c444e1d42784cfa6f26b0c0eed645cc12..5d6ecc8a16e7236bd48e78f900400315aa262b8d 100644 --- a/smash/web/templates/doctors/index.html +++ b/smash/web/templates/doctors/index.html @@ -18,7 +18,7 @@ {% block maincontent %} <div> - <a href="{% url 'web.views.doctoradd' %}" class="btn btn-app"> + <a href="{% url 'web.views.doctor_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new worker</a> </div> @@ -53,9 +53,9 @@ {% endautoescape %} </td> <td>{{ worker.unit }}</td> - <td><a href="{% url 'web.views.doctordetails' worker.id %}" type="button" class="btn btn-block btn-default">Details</a></td> - <td><a href="{% url 'web.views.doctoredit' worker.id %}" type="button" class="btn btn-block btn-default">Edit</a></td> - <td><a href="{% url 'web.views.doctoravail' worker.id %}" type="button" class="btn btn-block btn-default">Modify availability</a></td> + <td><a href="{% url 'web.views.doctor_details' worker.id %}" type="button" class="btn btn-block btn-default">Details</a></td> + <td><a href="{% url 'web.views.doctor_edit' worker.id %}" type="button" class="btn btn-block btn-default">Edit</a></td> + <td><a href="{% url 'web.views.doctor_availability' worker.id %}" type="button" class="btn btn-block btn-default">Modify availability</a></td> <td> {% if worker.isOnLeave %}<button type="button" class="btn btn-block btn-danger">YES</button> {% else %}<button type="button" class="btn btn-block btn-success">NO</button> diff --git a/smash/web/templates/subjects/index.html b/smash/web/templates/subjects/index.html index f27fe6127a0733aeca6fc5bc4fcb8f2344846a29..1c6ed6bf14f7152abbc5455b508bebc26633f0dc 100644 --- a/smash/web/templates/subjects/index.html +++ b/smash/web/templates/subjects/index.html @@ -19,7 +19,7 @@ {% block maincontent %} <div> - <a href="{% url 'web.views.subjectadd' %}" class="btn btn-app"> + <a href="{% url 'web.views.subject_add' %}" class="btn btn-app"> <i class="fa fa-plus"></i> Add new subject </a> @@ -61,9 +61,9 @@ </td> <td>{{ subject.get_subjectStatus_display }}</td> <td>12-10-2016</td> - <td><a href="{% url 'web.views.subjectdet' subject.id %}" type="button" class="btn btn-block btn-default">Details</a></td> - <td><a href="{% url 'web.views.subjectedit' subject.id %}" type="button" class="btn btn-block btn-default">Edit</a></td> - <td><a href="{% url 'web.views.subjectdelete' subject.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> + <td><a href="{% url 'web.views.subject_details' subject.id %}" type="button" class="btn btn-block btn-default">Details</a></td> + <td><a href="{% url 'web.views.subject_edit' subject.id %}" type="button" class="btn btn-block btn-default">Edit</a></td> + <td><a href="{% url 'web.views.subject_delete' subject.id %}" type="button" class="btn btn-block btn-default">Delete</a></td> </tr> {% endfor %} diff --git a/smash/web/urls.py b/smash/web/urls.py index 900917f6e3ae6981ad3f6db03fc87f817661b04a..a46b4addf91b34ac9f38f93dcf022b0eea86d052 100644 --- a/smash/web/urls.py +++ b/smash/web/urls.py @@ -18,23 +18,30 @@ from web import views urlpatterns = [ url(r'assignments$', views.assignments, name='web.views.assignments'), - url(r'assignments/details/(?P<id>\d+)$', views.assignmentdetails, name='web.views.assignmentdetails'), + url(r'assignments/details/(?P<id>\d+)$', views.assignment_details, name='web.views.assignment_details'), + url(r'visits$', views.visits, name='web.views.visits'), + url(r'subjects$', views.subjects, name='web.views.subjects'), - url(r'subjects/add$', views.subjectadd, name='web.views.subjectadd'), - url(r'subjects/details/(?P<id>\d+)$', views.subjectdet, name='web.views.subjectdet'), - url(r'subjects/edit/(?P<id>\d+)$', views.subjectedit, name='web.views.subjectedit'), - url(r'subjects/delete/(?P<id>\d+)$', views.subjectdelete, name='web.views.subjectdelete'), + url(r'subjects/add$', views.subject_add, name='web.views.subject_add'), + url(r'subjects/details/(?P<id>\d+)$', views.subject_details, name='web.views.subject_details'), + url(r'subjects/edit/(?P<id>\d+)$', views.subject_edit, name='web.views.subject_edit'), + url(r'subjects/delete/(?P<id>\d+)$', views.subject_delete, name='web.views.subject_delete'), + url(r'doctors$', views.doctors, name='web.views.doctors'), - url(r'doctors/add$', views.doctoradd, name='web.views.doctoradd'), - url(r'doctors/details/(?P<id>\d+)$', views.doctordetails, name='web.views.doctordetails'), - url(r'doctors/edit/(?P<id>\d+)$', views.doctoredit, name='web.views.doctoredit'), - url(r'doctors/avaibility/(?P<id>\d+)$', views.doctoravail, name='web.views.doctoravail'), - url(r'doctors/availdelete/(?P<doctor_id>\d+)/(?P<availibility_id>\d+)$', views.availdelete, name='web.views.availdelete'), + url(r'doctors/add$', views.doctor_add, name='web.views.doctor_add'), + url(r'doctors/details/(?P<doctor_id>\d+)$', views.doctor_details, name='web.views.doctor_details'), + url(r'doctors/edit/(?P<doctor_id>\d+)$', views.doctor_edit, name='web.views.doctor_edit'), + url(r'doctors/availability/(?P<doctor_id>\d+)$', views.doctor_availability, name='web.views.doctor_availability'), + url(r'doctors/availability/(?P<doctor_id>\d+)/delete/(?P<availability_id>\d+)$', views.doctor_availability_delete, name='web.views.doctor_availability_delete'), + url(r'equipment_and_rooms$', views.equipment_and_rooms, name='web.views.equipment_and_rooms'), url(r'equipment_and_rooms/eqdef$', views.equipment_def, name='web.views.equipment_def'), + url(r'mail_templates$', views.mail_templates, name='web.views.mail_templates'), + url(r'login$', views.login, name='web.views.login'), url(r'logout$', views.logout, name='web.views.logout'), + url(r'^$', views.index, name='web.views.index') ] diff --git a/smash/web/views.py b/smash/web/views.py index 7578865586aebfc87f966f60cebeeb281137cfa7..7d36df20d7b4b32b6c74f8a10f3d99b452056f23 100644 --- a/smash/web/views.py +++ b/smash/web/views.py @@ -71,7 +71,7 @@ def subjects(request): return wrap_response(request, 'subjects/index.html', context) -def subjectadd(request): +def subject_add(request): if request.method == 'POST': form = SubjectAddForm(request.POST, request.FILES) if form.is_valid(): @@ -83,13 +83,13 @@ def subjectadd(request): return wrap_response(request, 'subjects/add.html', {'form': form}) -def subjectdet(request, id): +def subject_details(request, id): form = SubjectDetailForm(instance=Subject.objects.get(id=id)) return wrap_response(request, 'subjects/details.html', {'form': form}) -def subjectedit(request, id): +def subject_edit(request, id): if request.method == 'POST': form = SubjectEditForm(request.POST, request.FILES, instance=Subject.objects.get(id=id)) if form.is_valid(): @@ -100,7 +100,7 @@ def subjectedit(request, id): return wrap_response(request, 'subjects/edit.html', {'form': form}) -def subjectdelete(request, id): +def subject_delete(request, id): if request.method == 'POST': Subject.objects.get(id=id).delete() return redirect(subjects) @@ -118,7 +118,7 @@ def doctors(request): return wrap_response(request, "doctors/index.html", context) -def doctoradd(request): +def doctor_add(request): if request.method == 'POST': form = WorkerAddForm(request.POST, request.FILES) if form.is_valid(): @@ -131,25 +131,25 @@ def doctoradd(request): -def doctoredit(request, id): +def doctor_edit(request, doctor_id): if request.method == 'POST': - form = WorkerEditForm(request.POST, request.FILES, instance=Worker.objects.get(id=id)) + form = WorkerEditForm(request.POST, request.FILES, instance=Worker.objects.get(id=doctor_id)) if form.is_valid(): form.save() return redirect(doctors) else: - form = WorkerEditForm(instance=Worker.objects.get(id=id)) + form = WorkerEditForm(instance=Worker.objects.get(id=doctor_id)) return wrap_response(request, 'doctors/edit.html', {'form': form}) -def doctordetails(request, id): - form = WorkerDetailForm(instance=Worker.objects.get(id=id)) +def doctor_details(request, doctor_id): + form = WorkerDetailForm(instance=Worker.objects.get(id=doctor_id)) return wrap_response(request, 'doctors/details.html', {'form': form}) -def doctoravail(request, id): - avall = Avaibility.objects.filter(person=id) +def doctor_availability(request, doctor_id): + avall = Avaibility.objects.filter(person=doctor_id) avmon = avall.filter(dayNo=1) avtue = avall.filter(dayNo=2) @@ -165,14 +165,14 @@ def doctoravail(request, id): 'avthu': avthu, 'avfri': avfri, 'avsat': avsat, - 'id': id + 'id': doctor_id } - return wrap_response(request, "doctors/availdex.html", context) + return wrap_response(request, "doctors/availability_index.html", context) -def availdelete(request, doctor_id, availibility_id): - availibility = Avaibility.objects.filter(id=availibility_id) +def doctor_availability_delete(request, doctor_id, availability_id): + availibility = Avaibility.objects.filter(id=availability_id) if len(availibility) > 0: availibility.delete() return redirect(doctoravail, id=doctor_id) @@ -205,6 +205,6 @@ def assignments(request): return wrap_response(request, "assignments/index.html",context) -def assignmentdetails(request, id): +def assignment_details(request, id): form = AppointmentDetailForm(instance=Appointment.objects.get(id=id)) return wrap_response(request, 'assignments/details.html', {'form': form}) diff --git a/todos.txt b/todos.txt index a26952d53f65335485016e89e8deec8cd8316ec5..b3492bba995b1d3626cabfef9ac0f92acf3f9525 100644 --- a/todos.txt +++ b/todos.txt @@ -1,10 +1,11 @@ * TODO List ** Important - - forms.py - specify, which fields should be visible (for example, while adding new/editing workers, why would one see appointments?) + - label for's => give them correct html id's (all html forms). + Currently it works, but it's not valid HTML, as the ID (for labels) are all the same. + It requires a hack, because django forms are not-so-flexible - implement `on leave` button - what about possible sunday in availabilities? - - make some names sound/look more pythonic - in beta remember to disable Guest Access - in beta remember to forbid not-logged users to browse the API @@ -12,5 +13,10 @@ - None ** Possible improvements -- breadcrumbs - make them stack (multiple template inheritance?) -- label for's => give them correct html id's (all html forms) +- breadcrumbs - make them stack. Currently, they are made "half-manually". + While it is not a great problem, it is not a flexible solution +- make some names sound/look more pythonic. Unfortunately, due to + programmistic experience of our team, instead of sticking to python convencies + (lower case methods, fields; using underscore to break words instead of + camelCase), using full names and not abbrieviations, the code sometimes + resembles a mess.