|
1 | 1 | """ |
2 | 2 | Funciones de utilidad interna para la aplicación de valoraciones (reviews). |
3 | 3 | """ |
| 4 | + |
4 | 5 | from django.contrib import messages |
5 | | -from django.shortcuts import redirect, get_object_or_404 |
6 | 6 | from django.http import HttpResponseForbidden |
| 7 | +from django.shortcuts import get_object_or_404, redirect |
7 | 8 | from django.utils import timezone |
8 | | - |
9 | | -from .models import Review |
10 | 9 | from rides.models import Ride |
| 10 | + |
| 11 | +from .constants import (CREATE_REVIEW_NAME, DELETE_REVIEW_NAME, |
| 12 | + DETAIL_REVIEW_NAME, FORM_KEY, LIST_REVIEWS_NAME, |
| 13 | + NO_PARTICIPATION_ERROR, NO_PERMISSION_ERROR, |
| 14 | + REVIEW_ALREADY_EXISTS_ERROR, REVIEW_CREATED_SUCCESS, |
| 15 | + REVIEW_DELETED_SUCCESS, REVIEW_KEY, REVIEWS_GIVEN_KEY, |
| 16 | + REVIEWS_RECEIVED_KEY, RIDE_KEY, |
| 17 | + RIDE_NOT_FINISHED_ERROR, get_url_full) |
11 | 18 | from .forms import ReviewForm |
12 | | -from .constants import ( |
13 | | - CREATE_REVIEW_NAME, DELETE_REVIEW_NAME, LIST_REVIEWS_NAME, DETAIL_REVIEW_NAME, |
14 | | - REVIEW_KEY, REVIEWS_GIVEN_KEY, REVIEWS_RECEIVED_KEY, RIDE_KEY, FORM_KEY, |
15 | | - REVIEW_CREATED_SUCCESS, REVIEW_DELETED_SUCCESS, NO_PERMISSION_ERROR, |
16 | | - NO_PARTICIPATION_ERROR, RIDE_NOT_FINISHED_ERROR, REVIEW_ALREADY_EXISTS_ERROR, |
17 | | - get_url_full |
18 | | -) |
19 | | -from .public import ( |
20 | | - get_review_by_id, get_reviews_by_user, get_reviews_received_by_user, |
21 | | - user_has_participation, ride_has_finished, can_review_ride, |
22 | | - can_delete_review, get_user_already_reviewed |
23 | | -) |
| 19 | +from .models import Review |
| 20 | +from .public import (can_delete_review, can_review_ride, get_review_by_id, |
| 21 | + get_reviews_by_user, get_reviews_received_by_user, |
| 22 | + get_user_already_reviewed, ride_has_finished, |
| 23 | + user_has_participation) |
| 24 | + |
24 | 25 |
|
25 | 26 | def get_review_or_404(review_id): |
26 | 27 | """ |
27 | 28 | Obtiene una valoración o devuelve un 404. |
28 | 29 | """ |
29 | 30 | return get_object_or_404(Review, pk=review_id) |
30 | 31 |
|
| 32 | + |
31 | 33 | def get_ride_or_404(ride_id): |
32 | 34 | """ |
33 | 35 | Obtiene un viaje o devuelve un 404. |
34 | 36 | """ |
35 | 37 | return get_object_or_404(Ride, pk=ride_id) |
36 | 38 |
|
| 39 | + |
37 | 40 | def check_review_permission(request, ride): |
38 | 41 | """ |
39 | 42 | Verifica que el usuario tenga permiso para valorar un viaje. |
40 | 43 | """ |
41 | 44 | # Verificar que el usuario participó en el viaje (como conductor o pasajero) |
42 | 45 | if not user_has_participation(request.user, ride): |
43 | 46 | messages.error(request, NO_PARTICIPATION_ERROR) |
44 | | - return redirect('rides:ride_detail', ride_id=ride.id) |
45 | | - |
| 47 | + return redirect("rides:ride_detail", ride_id=ride.id) |
| 48 | + |
46 | 49 | # Verificar que el viaje ya ha ocurrido |
47 | 50 | if not ride_has_finished(ride): |
48 | 51 | messages.error(request, RIDE_NOT_FINISHED_ERROR) |
49 | | - return redirect('rides:ride_detail', ride_id=ride.id) |
50 | | - |
| 52 | + return redirect("rides:ride_detail", ride_id=ride.id) |
| 53 | + |
51 | 54 | # Verificar si el usuario ya ha dejado una valoración para este viaje |
52 | 55 | if get_user_already_reviewed(request.user, ride): |
53 | 56 | messages.info(request, REVIEW_ALREADY_EXISTS_ERROR) |
54 | | - return redirect('rides:ride_detail', ride_id=ride.id) |
55 | | - |
| 57 | + return redirect("rides:ride_detail", ride_id=ride.id) |
| 58 | + |
56 | 59 | return None |
57 | 60 |
|
| 61 | + |
58 | 62 | def check_delete_permission(request, review): |
59 | 63 | """ |
60 | 64 | Verifica que el usuario tenga permiso para eliminar una valoración. |
61 | 65 | """ |
62 | 66 | if not can_delete_review(request.user, review): |
63 | 67 | return HttpResponseForbidden(NO_PERMISSION_ERROR) |
64 | | - |
| 68 | + |
65 | 69 | return None |
66 | 70 |
|
| 71 | + |
67 | 72 | def format_review_for_api(review): |
68 | 73 | """ |
69 | 74 | Formatea una valoración para la API JSON. |
70 | 75 | """ |
71 | 76 | return { |
72 | | - 'id': review.id, |
73 | | - 'user': review.user.username, |
74 | | - 'ride': { |
75 | | - 'id': review.ride.id, |
76 | | - 'origin': review.ride.origin, |
77 | | - 'destination': review.ride.destination, |
78 | | - 'driver': review.ride.driver.username, |
79 | | - } if review.ride else None, |
80 | | - 'rating': review.rating, |
81 | | - 'comment': review.comment, |
82 | | - 'created_at': review.created_at.strftime('%Y-%m-%d %H:%M'), |
| 77 | + "id": review.id, |
| 78 | + "user": review.user.username, |
| 79 | + "ride": ( |
| 80 | + { |
| 81 | + "id": review.ride.id, |
| 82 | + "origin": review.ride.origin, |
| 83 | + "destination": review.ride.destination, |
| 84 | + "driver": review.ride.driver.username, |
| 85 | + } |
| 86 | + if review.ride |
| 87 | + else None |
| 88 | + ), |
| 89 | + "rating": review.rating, |
| 90 | + "comment": review.comment, |
| 91 | + "created_at": review.created_at.strftime("%Y-%m-%d %H:%M"), |
83 | 92 | } |
84 | 93 |
|
| 94 | + |
85 | 95 | def prepare_review_form_context(request, ride): |
86 | 96 | """ |
87 | 97 | Prepara el contexto para el formulario de valoración. |
88 | 98 | """ |
89 | 99 | form = ReviewForm(request.POST or None) |
90 | | - |
91 | | - return { |
92 | | - FORM_KEY: form, |
93 | | - RIDE_KEY: ride |
94 | | - } |
| 100 | + |
| 101 | + return {FORM_KEY: form, RIDE_KEY: ride} |
| 102 | + |
95 | 103 |
|
96 | 104 | def prepare_review_list_context(request): |
97 | 105 | """ |
98 | 106 | Prepara el contexto para la lista de valoraciones. |
99 | 107 | """ |
100 | | - reviews_given = get_reviews_by_user(request.user) |
101 | | - reviews_received = get_reviews_received_by_user(request.user) |
102 | | - |
| 108 | + # Verificar si se ha solicitado ver valoraciones de otro usuario |
| 109 | + username = request.GET.get("user") |
| 110 | + target_user = None |
| 111 | + |
| 112 | + if username: |
| 113 | + from django.contrib.auth.models import User |
| 114 | + |
| 115 | + try: |
| 116 | + target_user = User.objects.get(username=username) |
| 117 | + except User.DoesNotExist: |
| 118 | + pass |
| 119 | + |
| 120 | + # Si no se encontró el usuario o no se proporcionó username, usar el usuario actual |
| 121 | + if not target_user: |
| 122 | + target_user = request.user |
| 123 | + |
| 124 | + # Determinar si estamos viendo nuestras propias valoraciones o las de otro usuario |
| 125 | + viewing_own = target_user == request.user |
| 126 | + |
| 127 | + reviews_given = get_reviews_by_user(target_user) |
| 128 | + reviews_received = get_reviews_received_by_user(target_user) |
| 129 | + |
103 | 130 | return { |
104 | 131 | REVIEWS_GIVEN_KEY: reviews_given, |
105 | | - REVIEWS_RECEIVED_KEY: reviews_received |
| 132 | + REVIEWS_RECEIVED_KEY: reviews_received, |
| 133 | + "target_user": target_user, |
| 134 | + "viewing_own": viewing_own, |
106 | 135 | } |
107 | 136 |
|
| 137 | + |
108 | 138 | def prepare_review_detail_context(review): |
109 | 139 | """ |
110 | 140 | Prepara el contexto para la vista detallada de una valoración. |
111 | 141 | """ |
112 | | - return { |
113 | | - REVIEW_KEY: review |
114 | | - } |
| 142 | + return {REVIEW_KEY: review} |
| 143 | + |
115 | 144 |
|
116 | 145 | def prepare_review_delete_context(review): |
117 | 146 | """ |
118 | 147 | Prepara el contexto para la confirmación de eliminación de una valoración. |
119 | 148 | """ |
120 | | - return { |
121 | | - REVIEW_KEY: review |
122 | | - } |
| 149 | + return {REVIEW_KEY: review} |
| 150 | + |
123 | 151 |
|
124 | 152 | def redirect_after_delete(review): |
125 | 153 | """ |
126 | 154 | Redirecciona adecuadamente después de eliminar una valoración. |
127 | 155 | """ |
128 | 156 | # Si el viaje existe, redireccionar a la página de detalles del viaje |
129 | 157 | if review.ride: |
130 | | - return redirect('rides:ride_detail', ride_id=review.ride.id) |
131 | | - |
| 158 | + return redirect("rides:ride_detail", ride_id=review.ride.id) |
| 159 | + |
132 | 160 | # De lo contrario, redireccionar a la lista de valoraciones |
133 | 161 | return redirect(get_url_full(LIST_REVIEWS_NAME)) |
0 commit comments