···11+# -*- coding: utf-8 -*-
22+# Generated by Django 1.10.2 on 2017-06-25 20:18
33+from __future__ import unicode_literals
44+55+from django.db import migrations, models
66+77+88+class Migration(migrations.Migration):
99+1010+ dependencies = [
1111+ ('journeys', '0017_auto_20170624_2019'),
1212+ ]
1313+1414+ operations = [
1515+ migrations.AlterField(
1616+ model_name='residence',
1717+ name='address',
1818+ field=models.TextField(blank=True, default='', help_text='La dirección del lugar, según quieras que la vean los demás.', verbose_name='dirección'),
1919+ ),
2020+ ]
+33-20
upvcarshare/journeys/models.py
···8282 here. Each residence belongs to a user.
8383 """
8484 user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="residences")
8585- address = models.TextField(verbose_name=_("dirección"), help_text=_("La dirección del lugar, según quieras que la vean los demás."))
8585+ address = models.TextField(
8686+ verbose_name=_("dirección"),
8787+ help_text=_("La dirección del lugar, según quieras que la vean los demás."),
8888+ default="",
8989+ blank=True
9090+ )
86918792 objects = ResidenceManager()
8893···194199 rules = rrulestr(self.recurrence, dtstart=self.departure)
195200 if rules._until is None:
196201 rules._until = default_until(self.departure)
197197- dates = list(map(lambda d: make_aware(d), list(rules)))
202202+ dates = list(rules)
203203+ if dates and dates[0].tzinfo is None:
204204+ dates = list(map(lambda d: make_aware(d), dates))
198205 return zip(dates, map(lambda d: d + interval, dates))
199206 return [(self.departure, self.arrival)]
200207···311318 return self.free_places - self.count_passengers()
312319 return 0
313320321321+ def _join_passenger(self, user):
322322+ if self.passengers.filter(user=user).exists() or self.template.driver == user:
323323+ raise AlreadyAPassenger()
324324+ if self.count_passengers() < self.free_places:
325325+ passenger = Passenger.objects.create(
326326+ journey=self,
327327+ user=user,
328328+ status=UNKNOWN
329329+ )
330330+ return passenger
331331+314332 @dispatch(JOIN)
315333 def join_passenger(self, user, join_to=None):
316334 """A user joins a journey.
···319337 """
320338 # Join only one
321339 if join_to is None or join_to == "one":
322322- if self.passengers.filter(user=user).exists() or self.template.driver == user:
323323- raise AlreadyAPassenger()
324324- if self.count_passengers() < self.free_places:
325325- passenger = Passenger.objects.create(
326326- journey=self,
327327- user=user,
328328- status=UNKNOWN
329329- )
330330- return passenger
340340+ return self._join_passenger(user=user)
331341 # Join to recurrence
332342 elif join_to is not None and join_to == "all":
333343 if self.has_recurrence:
334334- journeys = self.brothers()
344344+ journeys = self.brothers(exclude_myself=True)
335345 journeys = journeys.filter(departure__gte=self.departure)
336336- passengers = []
346346+ passengers = [self._join_passenger(user=user)]
337347 for journey in journeys:
338348 try:
339349 passengers.append(journey.join_passenger(user))
···344354 elif join_to is not None and len(join_to.split("/")) > 0:
345355 dates = map(lambda item: datetime.datetime.strptime(item, "%d/%m/%Y"), join_to.split(","))
346356 conditions = [Q(departure__day=date.day, departure__month=date.month, departure__year=date.year) for date in dates]
347347- journeys = self.brothers()
357357+ journeys = self.brothers(exclude_myself=True)
348358 journeys = journeys.filter(reduce(lambda x, y: x | y, conditions))
349349- passengers = []
359359+ passengers = [self._join_passenger(user=user)]
350360 for journey in journeys:
351361 try:
352362 passengers.append(journey.join_passenger(user))
···355365 return passengers
356366 raise NoFreePlaces()
357367358358- @dispatch(LEAVE)
359359- def leave_passenger(self, user):
360360- """A user leave a journey.
361361- :param user:
362362- """
368368+ def _leave_passenger(self, user):
363369 if not self.is_passenger(user=user):
364370 raise NotAPassenger()
365371 self.passengers.filter(user=user).delete()
···367373 if self.total_passengers < 0:
368374 self.total_passengers = 0
369375 self.save()
376376+377377+ @dispatch(LEAVE)
378378+ def leave_passenger(self, user, leave_from=None):
379379+ """A user leave a journey.
380380+ :param user:
381381+ """
382382+ self._leave_passenger(user=user)
370383371384 @dispatch(THROW_OUT)
372385 def throw_out(self, user):
+21-10
upvcarshare/journeys/views/journeys.py
···1010from django.http import Http404
1111from django.shortcuts import render, redirect, get_object_or_404
1212from django.utils import timezone
1313+from django.utils.safestring import mark_safe
1314from django.utils.timezone import make_naive
1415from django.utils.translation import ugettext_lazy as _
1516from django.views.generic import View
···2728 template_name = "journeys/create.smart.html"
2829 form = SmartJourneyTemplateForm
29303030- def get(self, request):
3131+ @staticmethod
3232+ def _initial_values(request):
3133 residences = Residence.objects.filter(user=request.user)
3234 campuses = Campus.objects.all()
3335 initial_departure = timezone.now().replace(second=0, minute=0) + datetime.timedelta(hours=1)
···3840 "departure": initial_departure,
3941 "arrival": initial_departure + datetime.timedelta(minutes=30)
4042 }
4343+ return initial
4444+4545+ def get(self, request):
4646+ initial = self._initial_values(request)
4147 form = self.form(initial=initial, user=request.user)
4248 data = {
4349 "form": form
4450 }
4551 # Warnings
4652 if request.user.transports.count() == 0:
4747- messages.warning(request, _("Parece que no has creado ningún medio de transporte, "
4848- "si quieres crear un viaje y que otros compañeros puedan "
4949- "apuntarse, tienes que registrar antes un medio de transporte."))
5353+ messages.warning(request, mark_safe(_(
5454+ "Parece que no has creado ningún medio de transporte, "
5555+ "si quieres crear un viaje y que otros compañeros puedan "
5656+ "apuntarse, tienes que <strong>registrar antes un medio de transporte</strong>."
5757+ )))
5058 if request.user.residences.count() == 0:
5151- messages.warning(request, _("Parece que no has especificado desde donde o hasta donde sueles viajar. "
5252- "Para dar de alta un viaje deberás antes registrar al menos un lugar para usar "
5353- "como origen o destino."))
5959+ messages.warning(request, mark_safe(_(
6060+ "Parece que no has especificado desde donde o hasta donde sueles viajar. "
6161+ "Para dar de alta un viaje deberás antes <strong>registrar al menos un lugar</strong> para usar "
6262+ "como origen o destino."
6363+ )))
5464 return render(request, self.template_name, data)
55655666 def post(self, request):
5757- form = self.form(request.POST, user=request.user)
6767+ form = self.form(request.POST, user=request.user, initial=self._initial_values(request))
5868 data = {
5969 "form": form
6070 }
6171 if form.is_valid():
6262- journey = form.save()
6363- return redirect("journeys:details", pk=journey.pk)
7272+ journey_template = form.save()
7373+ journeys = journey_template.journeys.order_by("-departure")
7474+ return redirect("journeys:details", pk=journeys.first().pk)
6475 return render(request, self.template_name, data)
65766677
+1-1
upvcarshare/journeys/views/places.py
···3636 if form.is_valid():
3737 residence = form.save(user=request.user)
3838 messages.success(request, ugettext('Has creado el lugar "%s"') % residence.name)
3939- return redirect("journeys:residences")
3939+ return redirect(request.GET.get("next", "journeys:residences"))
4040 return render(request, self.template_name, data)
41414242
+1-1
upvcarshare/journeys/views/transports.py
···3838 if form.is_valid():
3939 form.save(user=request.user)
4040 messages.success(request, _('Has creado el transporte correctamente'))
4141- return redirect("journeys:transports")
4141+ return redirect(request.GET.get("next", "journeys:transports"))
4242 data = {"form": form}
4343 return render(request, self.template_name, data)
4444
+1-1
upvcarshare/notifications/models.py
···6767 target_date = localize(target_date)
6868 if self.verb == JOIN:
6969 # actor is a user and target is a journey
7070- value = _("%(user)s se ha <strong>unido</strong> al viaje <strong>%(journey)s</strong> del %(date)s") % {
7070+ value = _("%(user)s ha <strong>solicitado</strong> unirse al viaje <strong>%(journey)s</strong> del %(date)s") % {
7171 "user": six.text_type(self.actor),
7272 "journey": six.text_type(self.target).lower(),
7373 "date": target_date,