• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

gcivil-nyu-org / Wednesday-Fall2023-Team-4 / 352

07 Nov 2023 11:43PM UTC coverage: 60.833% (-8.6%) from 69.403%
352

Pull #129

travis-pro

web-flow
Merge de687035e into 23a9f9394
Pull Request #129: Tempprod branch to Master

28 of 125 new or added lines in 5 files covered. (22.4%)

4 existing lines in 1 file now uncovered.

292 of 480 relevant lines covered (60.83%)

0.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

33.06
/rrapp/views.py
1
from typing import Any
1✔
2
from django.shortcuts import get_object_or_404, render
1✔
3
from django.db.models import Q
1✔
4

5
# Create your views here.
6
from django.core.paginator import Paginator
1✔
7
from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
1✔
8
from django.urls import reverse
1✔
9
from django.views import generic
1✔
10

11
from psycopg2.extras import NumericRange
1✔
12

13
from django.contrib import messages
1✔
14
from django.contrib.auth import authenticate, login, logout
1✔
15
from django.contrib.auth.decorators import login_required
1✔
16
from django.utils.decorators import method_decorator
1✔
17

18
from .models import Listing, Renter, Rentee, SavedListing
1✔
19
from .forms import MyUserCreationForm, ListingForm
1✔
20
from django.contrib.auth import get_user_model
1✔
21

22
User = get_user_model()
1✔
23

24

25
class HomeView(generic.View):
1✔
26
    def dispatch(self, request, *args, **kwargs):
1✔
27
        # will redirect to the home page if a user tries to
28
        # access the register page while logged in
29
        if request.user.is_authenticated:
×
30
            return HttpResponseRedirect(
×
31
                reverse("rrapp:rentee_listings", args=(request.user.id,))
32
            )
33
        # else process dispatch as it otherwise normally would
34
        return super(HomeView, self).dispatch(request, *args, **kwargs)
×
35

36
    def get(self, request, *args, **kwargs):
1✔
NEW
37
        return render(request, "rrapp/home.html")
×
38

39

40
class LoginView(generic.View):
1✔
41
    context = {"page": "login"}
1✔
42

43
    def dispatch(self, request, *args, **kwargs):
1✔
44
        # will redirect to the home page if a user tries to
45
        # access the register page while logged in
46
        if request.user.is_authenticated:
×
47
            # if len(Renter.objects.all()) > 0 and request.user.id in [
48
            #     i.user.id for i in Renter.objects.all()
49
            # ]:
50
            #     login(request, request.user)
51
            #     return HttpResponseRedirect(
52
            #         reverse('rrapp:my_listings', args=(request.user.id,))
53
            #     )
54
            # else:
55
            #     login(request, request.user)
56
            #     return HttpResponseRedirect(
57
            #         reverse('rrapp:rentee_listings', args=(request.user.id,))
58
            #     )
59
            return HttpResponseRedirect(
×
60
                reverse("rrapp:rentee_listings", args=(request.user.id,))
61
            )
62
        # else process dispatch as it otherwise normally would
63
        return super(LoginView, self).dispatch(request, *args, **kwargs)
×
64

65
    def get(self, request, *args, **kwargs):
1✔
NEW
66
        return render(request, "rrapp/login_register.html", self.context)
×
67

68
    def post(self, request, *args, **kwargs):
1✔
NEW
69
        email = request.POST.get("email").lower()
×
NEW
70
        password = request.POST.get("password")
×
71
        try:
×
72
            user = User.objects.get(email=email)
×
73
        except Exception:
×
NEW
74
            messages.error(request, "User does not exist")
×
75
        user = authenticate(request, email=email, password=password)
×
76
        if user is not None:
×
77
            # if len(Renter.objects.all()) > 0 and user.id in [
78
            #     i.user.id for i in Renter.objects.all()
79
            # ]:
80
            #     login(request, user)
81
            #     return HttpResponseRedirect(
82
            #         reverse('rrapp:my_listings', args=(request.user.id,))
83
            #     )
84
            # else:
85
            #     login(request, user)
86
            #     return HttpResponseRedirect(
87
            #         reverse('rrapp:rentee_listings', args=(request.user.id,))
88
            #     )
89
            login(request, user)
×
90
            return HttpResponseRedirect(
×
91
                reverse("rrapp:rentee_listings", args=(request.user.id,))
92
            )
93
        else:
NEW
94
            messages.error(request, "Username OR password does not exit")
×
NEW
95
        return render(request, "rrapp/login_register.html", self.context)
×
96

97

98
class LogoutView(generic.View):
1✔
99
    def get(self, request, *args, **kwargs):
1✔
100
        logout(request)
×
NEW
101
        return render(request, "rrapp/home.html")
×
102

103

104
class RegisterView(generic.View):
1✔
105
    initial = {"key": "value"}
1✔
106

107
    def dispatch(self, request, *args, **kwargs):
1✔
108
        # will redirect to the home page if a user tries to
109
        # access the register page while logged in
110
        if request.user.is_authenticated:
×
111
            return HttpResponseRedirect(
×
112
                reverse("rrapp:rentee_listings", args=(request.user.id,))
113
            )
114
        # else process dispatch as it otherwise normally would
115
        return super(RegisterView, self).dispatch(request, *args, **kwargs)
×
116

117
    def get(self, request, *args, **kwargs):
1✔
118
        form = MyUserCreationForm(initial=self.initial)
×
NEW
119
        return render(request, "rrapp/login_register.html", {"form": form})
×
120

121
    def post(self, request, *args, **kwargs):
1✔
122
        form = MyUserCreationForm(request.POST)
×
123
        if form.is_valid():
×
124
            user = form.save(commit=False)
×
NEW
125
            if not user.email[-4:] == ".edu":
×
NEW
126
                messages.error(request, "Email format is not correct")
×
NEW
127
                return render(request, "rrapp/login_register.html", {"form": form})
×
128
            user.save()
×
129
            user_id = user.id
×
130

131
            type_renter = Renter.objects.create(user=user)
×
132
            type_rentee = Rentee.objects.create(user=user)
×
133
            type_renter.save()
×
134
            type_rentee.save()
×
135
            login(request, user)
×
136
            return HttpResponseRedirect(
×
137
                reverse("rrapp:rentee_listings", args=(user_id,))
138
            )
139
        else:
NEW
140
            messages.error(request, "An error occurred during registration")
×
141

NEW
142
        return render(request, "rrapp/login_register.html", {"form": form})
×
143

144

145
@method_decorator(login_required, name="dispatch")
1✔
146
class ListingIndexView(generic.ListView):
1✔
147
    template_name = "rrapp/my_listings.html"
1✔
148
    context_object_name = "latest_listings"
1✔
149

150
    def get_queryset(self):
1✔
151
        """Return the last five published questions."""
152
        user_id = self.kwargs["user_id"]
×
153
        all_listings = Listing.objects.filter(user=user_id).order_by("-created_at")
×
154
        paginator = Paginator(all_listings, 10)
×
155
        page_number = self.request.GET.get("page")
×
156
        latest_listings_page = paginator.get_page(page_number)
×
157
        return latest_listings_page
×
158

159
    def get_context_data(self, **kwargs: Any):
1✔
160
        context_data = super().get_context_data(**kwargs)
×
NEW
161
        context_data["user_id"] = self.kwargs["user_id"]
×
NEW
162
        return context_data
×
NEW
163

×
NEW
164

×
UNCOV
165
@method_decorator(login_required, name="dispatch")
×
166
class ListingDetailView(generic.DetailView):
167
    model = Listing
168
    template_name = "rrapp/listing_detail.html"
1✔
169

1✔
170
    def get_context_data(self, **kwargs: Any):
1✔
171
        context_data = super().get_context_data(**kwargs)
1✔
172
        context_data["user_id"] = self.kwargs["user_id"]
173
        return context_data
1✔
174

×
NEW
175

×
NEW
176
@method_decorator(login_required, name="dispatch")
×
NEW
177
class ListingDetailRenteeView(generic.DetailView):
×
NEW
178
    model = Listing
×
UNCOV
179
    template_name = "rrapp/rentee_listing_detail.html"
×
180

181
    def get_context_data(self, **kwargs: Any):
182
        context_data = super().get_context_data(**kwargs)
1✔
183
        context_data["user_id"] = self.kwargs["user_id"]
1✔
184
        context_data["saved"] = self.check_state(
1✔
185
            self.kwargs["user_id"], self.kwargs["pk"]
1✔
186
        )
187
        # print("saved: ", context_data["saved"])
1✔
188
        return context_data
×
NEW
189

×
NEW
190
    def check_state(self, user_id, listing_id):
×
NEW
191
        # print(user_id, listing_id)
×
NEW
192
        if SavedListing.objects.filter(
×
UNCOV
193
            rentee_id__user=user_id, saved_listings=listing_id
×
194
        ).exists():
195
            return True
196
        else:
197
            return False
×
198

199
    def post(self, request, *args, **kwargs):
1✔
200
        listing_id = self.kwargs["pk"]
201
        user_id = self.kwargs["user_id"]
×
202
        save_state = self.check_state(user_id, listing_id)
203
        if save_state:
204
            SavedListing.objects.filter(
×
205
                rentee_id__user=user_id, saved_listings=listing_id
206
            ).delete()
×
207
        else:
208
            rentee = Rentee.objects.get(user=user_id)
1✔
NEW
209
            listing = Listing.objects.get(id=listing_id)
×
NEW
210
            SavedListing.objects.create(rentee_id=rentee, saved_listings=listing)
×
211
        return HttpResponseRedirect(request.path_info)  # redirect to the same page
×
212

×
213

×
214
@method_decorator(login_required, name="dispatch")
215
class ListingResultsView(generic.ListView):
216
    template_name = "rrapp/rentee_listings.html"
217
    context_object_name = "queried_listings_page"
×
218

×
219
    def get_queryset(self):
×
220
        all_listings = Listing.objects.all().order_by("-created_at")
×
221
        sort_option = self.request.GET.get("sort", "created_at")
222

223
        # Extract the sorting order (Low to High or High to Low)
1✔
224
        sorting_order = ""  # Default to ascending order
1✔
225
        if sort_option.startswith("-"):
1✔
226
            sort_option = sort_option[1:]
1✔
227
            sorting_order = "-"  # Set to descending order
228

1✔
NEW
229
        # Apply sorting
×
NEW
230
        if sort_option not in [
×
231
            "monthly_rent",
232
            "number_of_bedrooms",
NEW
233
            "number_of_bathrooms",
×
NEW
234
        ]:
×
NEW
235
            sort_option = "created_at"
×
NEW
236
        all_listings = all_listings.order_by(f"{sorting_order}{sort_option}")
×
237

238
        # Apply filters
NEW
239
        filters = Q()
×
240

241
        monthly_rent = self.request.GET.get("monthly_rent")
242
        if monthly_rent:
243
            filters &= Q(monthly_rent__lte=monthly_rent)
NEW
244

×
NEW
245
        number_of_bedrooms = self.request.GET.get("number_of_bedrooms")
×
246
        if number_of_bedrooms:
247
            filters &= Q(number_of_bedrooms__lte=number_of_bedrooms)
NEW
248

×
249
        number_of_bathrooms = self.request.GET.get("number_of_bathrooms")
NEW
250
        if number_of_bathrooms:
×
NEW
251
            filters &= Q(number_of_bathrooms__lte=number_of_bathrooms)
×
NEW
252

×
253
        washer = self.request.GET.get("washer")
NEW
254
        if washer == "on":
×
NEW
255
            filters &= Q(washer=True)
×
NEW
256

×
257
        dryer = self.request.GET.get("dryer")
NEW
258
        if dryer == "on":
×
NEW
259
            filters &= Q(dryer=True)
×
NEW
260

×
261
        utilities_included = self.request.GET.get("utilities_included")
NEW
262
        if utilities_included == "on":
×
NEW
263
            filters &= Q(utilities_included=True)
×
NEW
264

×
265
        furnished = self.request.GET.get("furnished")
NEW
266
        if furnished == "on":
×
NEW
267
            filters &= Q(furnished=True)
×
NEW
268

×
269
        dishwasher = self.request.GET.get("dishwasher")
NEW
270
        if dishwasher == "on":
×
NEW
271
            filters &= Q(dishwasher=True)
×
NEW
272

×
273
        parking = self.request.GET.get("parking")
NEW
274
        if parking == "on":
×
NEW
275
            filters &= Q(parking=True)
×
NEW
276

×
277
        room_type = self.request.GET.get("room_type")
NEW
278
        if room_type:
×
NEW
279
            filters &= Q(room_type=room_type)
×
NEW
280

×
281
        food_groups_allowed = self.request.GET.get("food_groups_allowed")
NEW
282
        if food_groups_allowed:
×
NEW
283
            filters &= Q(food_groups_allowed=food_groups_allowed)
×
NEW
284

×
285
        pets_allowed = self.request.GET.get("pets_allowed")
NEW
286
        if pets_allowed:
×
NEW
287
            filters &= Q(pets_allowed=pets_allowed)
×
NEW
288

×
289
        # Continue filtering for other fields if needed
NEW
290

×
NEW
291
        # Combine filters
×
NEW
292
        all_listings = all_listings.filter(filters)
×
293

NEW
294
        paginator = Paginator(all_listings, 10)
×
NEW
295
        page_number = self.request.GET.get("page")
×
NEW
296
        queried_listings_page = paginator.get_page(page_number)
×
297
        return queried_listings_page
298

299
    def get_context_data(self, **kwargs: Any):
300
        context_data = super().get_context_data(**kwargs)
NEW
301
        context_data["user_id"] = self.kwargs["user_id"]
×
302
        return context_data
303

×
304

×
305
@method_decorator(login_required, name="dispatch")
×
306
class ListingUpdateView(generic.UpdateView):
×
307
    model = Listing
308
    template_name = "rrapp/listing_detail_modify.html"
1✔
309
    fields = [
×
NEW
310
        "status",
×
NEW
311
        "title",
×
NEW
312
        "description",
×
NEW
313
        "monthly_rent",
×
UNCOV
314
        "date_available_from",
×
315
        "date_available_to",
316
        "property_type",
317
        "room_type",
1✔
318
        "address1",
1✔
319
        "address2",
1✔
320
        "zip_code",
1✔
321
        "city",
1✔
322
        "state",
323
        "country",
324
        "washer",
325
        "dryer",
326
        "dishwasher",
327
        "microwave",
328
        "baking_oven",
329
        "parking",
330
        "number_of_bedrooms",
331
        "number_of_bathrooms",
332
        "furnished",
333
        "utilities_included",
334
        "age_range",
335
        "smoking_allowed",
336
        "pets_allowed",
337
        "food_groups_allowed",
338
    ]
339
    success_url = "rrapp:listing_detail"
340

341
    def get_success_url(self):
342
        user_id = self.kwargs["user_id"]
343
        listing_id = self.kwargs["pk"]
344
        return reverse("rrapp:listing_detail", args=(user_id, listing_id))
345

346

347
@method_decorator(login_required, name="dispatch")
348
class ListingNewView(generic.CreateView):
349
    model = Listing
350
    success_url = "rrapp:my_listings"
351
    form_class = ListingForm
1✔
352
    template_name = "rrapp/listing_new.html"
353

1✔
NEW
354
    def get_success_url(self):
×
NEW
355
        user_id = self.kwargs["user_id"]
×
NEW
356
        return reverse("rrapp:listing_new", args=(user_id,))
×
357

358
    def get_object(self, queryset=None):
359
        try:
1✔
360
            return self.request.user
1✔
361
        except Listing.DoesNotExist:
1✔
362
            return Listing.objects.create(user=self.request.user)
1✔
363

1✔
364
    def post(self, request: HttpRequest, *args: str, **kwargs: Any) -> HttpResponse:
1✔
365
        """handle user login post req
366

1✔
NEW
367
        Args:
×
NEW
368
            request (HttpRequest): http request object
×
369

370
        Returns:
1✔
371
            HttpResponse: redirect or login view with error hints
×
372
        """
×
373
        form = self.form_class(request.POST)
×
374
        u = User.objects.get(pk=self.kwargs["user_id"])
×
375
        form_data = self.get_form().data
376

1✔
377
        if form.is_valid():
378
            print("valid form", form.data)
379

380
        listing = Listing.objects.create(
381
            user=u,
382
            status=form_data.get("status"),
383
            title=form_data.get("title"),
384
            description=form_data.get("description"),
385
            monthly_rent=form_data.get("monthly_rent"),
×
NEW
386
            date_available_from=form_data.get("date_available_from"),
×
387
            date_available_to=form_data.get("date_available_to"),
×
388
            property_type=form_data.get("property_type"),
389
            room_type=form_data.get("room_type"),
×
NEW
390
            address1=form_data.get("address1"),
×
391
            address2=form_data.get("address2"),
392
            zip_code=form_data.get("zip_code"),
×
393
            city=form_data.get("city"),
394
            country=form_data.get("country"),
395
            washer=form_data.get("washer") == "true",
396
            dryer=form_data.get("dryer") == "true",
397
            dishwasher=form_data.get("dishwasher") == "true",
398
            microwave=form_data.get("microwave") == "true",
399
            baking_oven=form_data.get("baking_oven") == "true",
400
            parking=form_data.get("parking") == "true",
401
            number_of_bedrooms=form_data.get("number_of_bedrooms"),
402
            number_of_bathrooms=form_data.get("number_of_bathrooms"),
403
            furnished=form_data.get("furnished") == "true",
404
            utilities_included=form_data.get("utilities_included") == "true",
405
            smoking_allowed=form_data.get("smoking_allowed") == "true",
406
            pets_allowed=form_data.get("pets_allowed"),
407
            food_groups_allowed=form_data.get("food_groups_allowed"),
408
            age_range=NumericRange(
409
                int(form_data.get("age_range_0")), int(form_data.get("age_range_1"))
410
            ),
411
        )
412
        listing.save()
413
        return HttpResponseRedirect(
414
            reverse("rrapp:my_listings", args=(kwargs["user_id"],))
415
        )
416

417

418
@login_required(login_url="login")
419
def listing_delete(request, user_id, pk):
420
    # TODO:add the check  if request.user.is_authenticated():
421
    listing = get_object_or_404(Listing, pk=pk, user_id=user_id)
422
    listing.delete()
423
    # Always return an HttpResponseRedirect after successfully dealing
424
    # with POST data. This prevents data from being posted twice if a
×
425
    # user hits the Back button.
×
426
    return HttpResponseRedirect(reverse("rrapp:my_listings", args=(user_id,)))
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc