···12121313class NotAPassenger(Exception):
1414 msg = "The user is not a passenger of this journey."
1515+1616+1717+class UserNotAllowed(Exception):
1818+ msg = "The user is not a allowed to do this action."
···15151616from core.models import GisTimeStampedModel
1717from journeys import JOURNEY_KINDS, GOING, RETURN, DEFAULT_DISTANCE, DEFAULT_PROJECTED_SRID, DEFAULT_WGS84_SRID, \
1818- DEFAULT_TIME_WINDOW
1818+ DEFAULT_TIME_WINDOW, PASSENGER_STATUSES, UNKNOWN
1919from journeys.exceptions import NoFreePlaces, NotAPassenger, AlreadyAPassenger
2020from journeys.helpers import make_point_wgs84
2121-from journeys.managers import JourneyManager, ResidenceManager
2121+from journeys.managers import JourneyManager, ResidenceManager, MessageManager
2222from notifications import JOIN, LEAVE, CANCEL
2323from notifications.decorators import dispatch
2424···236236 """Gets the journey distance."""
237237 return self.residence.position.distance(self.campus.position) / 1000
238238239239+ def is_messenger_allowed(self, user):
240240+ """Check if the user is allowed to make messenger actions."""
241241+ return not(self.user != user and not self.is_passenger(user))
242242+239243 @dispatch(CANCEL)
240244 def cancel(self):
241245 """Cancels a journey."""
···247251 """A user who has joined a journey."""
248252 user = models.ForeignKey(settings.AUTH_USER_MODEL)
249253 journey = models.ForeignKey("journeys.Journey", related_name="passengers")
254254+ status = models.PositiveIntegerField(choices=PASSENGER_STATUSES, default=UNKNOWN)
250255251256 class Meta:
252257 unique_together = ["user", "journey"]
···257262 name = models.CharField(max_length=64, blank=True, null=True)
258263 user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="transports")
259264 default_places = models.PositiveIntegerField(default=4)
265265+266266+267267+class Message(TimeStampedModel):
268268+ """Message send by a passenger of the journey."""
269269+ user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="messages")
270270+ journey = models.ForeignKey("journeys.Journey", related_name="messages")
271271+ content = models.TextField()
272272+273273+ objects = MessageManager()
274274+
+6
upvcarshare/journeys/tests/factories.py
···44444545 class Meta:
4646 model = "journeys.Transport"
4747+4848+4949+class MessageFactory(factory.django.DjangoModelFactory):
5050+5151+ class Meta:
5252+ model = "journeys.Message"
···1818 {% if request.user == journey.user %}
1919 <a href="{% url "journeys:edit" journey.pk %}" class="btn btn-success" style="margin-bottom: 5px">{% trans "Editar" %}</a>
2020 {% if not journey.needs_driver and not journey.disabled %}
2121- <a href="{% url "journeys:cancel" journey.pk %}" class="btn btn-danger">{% trans "Cancelar trayecto" %}</a>
2121+ <a href="{% url "journeys:cancel" journey.pk %}" class="btn btn-danger">{% trans "Cancelar trayecto" %}</a>
2222 {% endif %}
2323 {% else %}
2424 {% journey_join_leave_button journey %}
···27272828{% block content %}
2929 <div class="row">
3030- <div class="col-sm-9">
3030+ <div class="col-sm-8">
3131 {% if not journey.needs_driver %}
3232 <h3>{% trans "Datos del transporte" %}</h3>
3333 <table class="table">
···5757 <h4 class="text-muted">{% trans "No se ha encontrado transporte recomendado" %}</h4>
5858 {% endfor %}
5959 {% endif %}
6060+ <h3>{% trans "Tablón de mensajes" %}</h3>
6161+ <messenger journey="{{ journey.pk }}" first-name="{{ request.user.first_name }}" last-name="{{ request.user.last_name }}"></messenger>
6262+ </div>
6363+ <div class="col-sm-4">
6064 {% if show_passengers %}
6165 <h3>{% trans "Pasajeros" %}</h3>
6266 <table class="table">
···8185 </tbody>
8286 </table>
8387 {% endif %}
8484- </div>
8585- <div class="col-sm-3">
8688 <h3>
8789 {% if journey.kind == 0 %}
8890 {% trans "Origen" %}
+3-1
upvcarshare/templates/journeys/recommended.html
···3535 {% for journey in journeys %}
3636 {% journey_item journey %}
3737 {% empty %}
3838- <h3 class="text-muted">{% trans "No trayectos recomendados" %}</h3>
3838+ <h3 class="text-muted">{% trans "No hemos encontrado trayectos recomendados" %}</h3>
3939+ <p class="lead">{% trans "Puedes crear los trayectos en los que necesitas transporte para que te mostremos aquí una lista de conducotres que pueden llevarte a tu destino." %}</p>
4040+ <a href="{% url "journeys:create" %}" class="btn btn-lg btn-primary">{% trans "Crear trayecto" %}</a>
3941 {% endfor %}
4042 </div>
4143 </div>