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

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

21 Nov 2023 02:45PM UTC coverage: 79.079% (+0.8%) from 78.296%
638

push

travis-pro

web-flow
Merge pull request #191 from gcivil-nyu-org/dev-hp2427

Dev hp2427

50 of 77 new or added lines in 4 files covered. (64.94%)

5 existing lines in 2 files now uncovered.

979 of 1238 relevant lines covered (79.08%)

0.79 hits per line

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

70.38
/rrapp/views.py
1
from django.shortcuts import get_object_or_404, render
1✔
2
from typing import Any, List
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, JsonResponse
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 django.contrib.auth import get_user_model
1✔
19
from django.contrib.auth.models import AbstractBaseUser
1✔
20
from django.contrib.auth.mixins import LoginRequiredMixin
1✔
21

22
from chat.models import DirectMessagePermission, Permission
1✔
23

24
from .models import Listing, Renter, Rentee, SavedListing, Photo
1✔
25
from .forms import MyUserCreationForm, ListingForm, UserForm, LoginForm
1✔
26

27
from django.urls import reverse_lazy
1✔
28
from django.contrib.auth.views import PasswordResetView, PasswordResetConfirmView
1✔
29
from django.contrib.messages.views import SuccessMessageMixin
1✔
30

31
from django.core.mail import EmailMessage
1✔
32
from django.contrib.sites.shortcuts import get_current_site
1✔
33
from django.template.loader import render_to_string
1✔
34
from django.utils.encoding import force_bytes, force_str
1✔
35
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
1✔
36
from .tokens import account_activation_token
1✔
37

38
from chat.views import get_pending_connections_count
1✔
39
from django.conf import settings
1✔
40

41
User = get_user_model()
1✔
42

43

44
class HomeView(generic.View):
1✔
45
    def dispatch(self, request, *args, **kwargs):
1✔
46
        # will redirect to the home page if a user tries to
47
        # access the register page while logged in
48
        if request.user.is_authenticated:
1✔
49
            return HttpResponseRedirect(reverse("rrapp:rentee_listings"))
1✔
50
        # else process dispatch as it otherwise normally would
51
        return super(HomeView, self).dispatch(request, *args, **kwargs)
1✔
52

53
    def get(self, request, *args, **kwargs):
1✔
54
        return render(request, "rrapp/home.html")
1✔
55

56

57
class LoginView(generic.View):
1✔
58
    context = {"page": "login"}
1✔
59

60
    def dispatch(self, request, *args, **kwargs):
1✔
61
        # will redirect to the home page if a user tries to
62
        # access the register page while logged in
63
        if request.user.is_authenticated:
1✔
64
            return HttpResponseRedirect(reverse("rrapp:rentee_listings"))
1✔
65
        # else process dispatch as it otherwise normally would
66
        return super(LoginView, self).dispatch(request, *args, **kwargs)
1✔
67

68
    def get(self, request, *args, **kwargs):
1✔
69
        form = LoginForm()
1✔
70
        self.context["form"] = form
1✔
71
        return render(request, "rrapp/login_register.html", self.context)
1✔
72

73
    def post(self, request, *args, **kwargs):
1✔
74
        loginForm = LoginForm(request.POST)
1✔
75
        if loginForm.is_valid():
1✔
76
            email = loginForm.cleaned_data.get("email")
1✔
77
            password = loginForm.cleaned_data.get("password")
1✔
78
            user = authenticate(request, email=email, password=password)
1✔
79
            if user is not None:
1✔
80
                login(request, user)
1✔
81
                return HttpResponseRedirect(reverse("rrapp:rentee_listings"))
1✔
82
            else:
83
                messages.error(request, "Username OR password does not exist")
1✔
84
        else:
85
            self.context["form"] = loginForm
×
86
        return render(request, "rrapp/login_register.html", self.context)
1✔
87

88

89
class ResetPasswordView(SuccessMessageMixin, PasswordResetView):
1✔
90
    template_name = 'rrapp/password_reset.html'
1✔
91
    email_template_name = 'rrapp/password_reset_email.html'
1✔
92
    subject_template_name = 'rrapp/password_reset_subject.txt'
1✔
93
    success_url = reverse_lazy('rrapp:password_reset_done')
1✔
94

95

96
class ConfirmPasswordResetView(PasswordResetConfirmView):
1✔
97
    success_url = reverse_lazy('rrapp:password_reset_complete')
1✔
98

99

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

105

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

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

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

121
    def post(self, request, *args, **kwargs):
1✔
122
        form = MyUserCreationForm(request.POST)
1✔
123
        if form.is_valid():
1✔
124
            user = form.save(commit=False)
1✔
125
            user.save()
1✔
126

127
            type_renter = Renter.objects.create(user=user)
1✔
128
            type_rentee = Rentee.objects.create(user=user)
1✔
129
            type_renter.save()
1✔
130
            type_rentee.save()
1✔
131
            login(request, user)
1✔
132
            return HttpResponseRedirect(reverse("rrapp:rentee_listings"))
1✔
133

134
        return render(request, "rrapp/login_register.html", {"form": form})
1✔
135

136

137
def verificationCheck(request, uidb64, token):
1✔
138
    try:
×
139
        uid = force_str(urlsafe_base64_decode(uidb64))
×
140
        user = User.objects.get(pk=uid)
×
141
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
×
142
        user = None
×
143
    if user is not None and account_activation_token.check_token(user, token):
×
144
        user.is_verified = True
×
145
        user.save()
×
146
        # login(request, user)
147
        # return redirect('home')
148
        messages.success(
×
149
            request,
150
            "Thank you for confirming. Your email is now verified!",
151
            extra_tags='alert alert-success',
152
        )
153
    else:
154
        messages.error(
×
155
            request, "Verification link is invalid!", extra_tags='alert alert-danger'
156
        )
157

158
    # return redirect('rrapp:home')
NEW
159
    return HttpResponseRedirect(reverse("rrapp:profile"))
×
160

161

162
@login_required
1✔
163
def verifyEmail(request):
1✔
164
    mail_subject = "Activate your user account."
1✔
165
    message = render_to_string(
1✔
166
        "rrapp/template_verify_account.html",
167
        {
168
            'user': request.user.username,
169
            'domain': get_current_site(request).domain,
170
            'uid': urlsafe_base64_encode(force_bytes(request.user.pk)),
171
            'token': account_activation_token.make_token(request.user),
172
            "protocol": 'https' if request.is_secure() else 'http',
173
        },
174
    )
175
    email = EmailMessage(mail_subject, message, to=[request.user.email])
1✔
176
    if email.send():
1✔
177
        # return HttpResponse(f'Dear {request.user}, please go to your email \
178
        #     {request.user.email} inbox and click on \
179
        #         received activation link to confirm and \
180
        #         complete the registration. Note: Check your spam folder.')
181
        messages.success(
1✔
182
            request,
183
            f'Hi {request.user}, please check your email \
184
            {request.user.email}\'s inbox and click on \
185
                received activation link to confirm and \
186
                complete the verification. Don\'t forget to check your spam folder.',
187
            extra_tags='alert alert-primary',
188
        )
189
        # return render(request, 'rrapp/home.html')
190
        # return redirect('rrapp:home')
191
        return HttpResponseRedirect(reverse("rrapp:profile"))
1✔
192
    else:
193
        messages.error(
×
194
            request,
195
            f'Problem sending email to {request.user.email}, \
196
            please check if you typed it correctly.',
197
            extra_tags='alert alert-danger',
198
        )
199
        # return render(request, 'rrapp/home.html')
200
        # return redirect('rrapp:home')
NEW
201
        return HttpResponseRedirect(reverse("rrapp:profile"))
×
202

203

204
@method_decorator(login_required, name="dispatch")
1✔
205
class ListingIndexView(generic.ListView):
1✔
206
    template_name = "rrapp/my_listings.html"
1✔
207
    context_object_name = "latest_listings"
1✔
208

209
    def get_queryset(self):
1✔
210
        """Return the last five published questions."""
211
        user_id = self.request.user.id
1✔
212
        all_listings = Listing.objects.filter(user=user_id).order_by("-created_at")
1✔
213
        paginator = Paginator(all_listings, 10)
1✔
214
        page_number = self.request.GET.get("page")
1✔
215
        latest_listings_page = paginator.get_page(page_number)
1✔
216
        return latest_listings_page
1✔
217

218
    def get_context_data(self, **kwargs: Any):
1✔
219
        context_data = super().get_context_data(**kwargs)
1✔
220
        user_id = self.request.user.id
1✔
221
        context_data["user_id"] = user_id
1✔
222
        context_data["user"] = self.request.user
1✔
223
        context_data["path"] = self.request.path_info.__contains__("renter")
1✔
224
        context_data["inbox"] = get_inbox_count(User.objects.get(id=user_id).username)
1✔
225
        return context_data
1✔
226

227

228
@method_decorator(login_required, name="dispatch")
1✔
229
class ShortListView(generic.ListView):
1✔
230
    template_name = "rrapp/shortListing.html"
1✔
231
    context_object_name = "latest_listings"
1✔
232

233
    def get_queryset(self):
1✔
234
        """Return the last five published questions."""
NEW
235
        user_id = self.request.user.id
×
236
        # shortlistings = Listing.objects.filter(user=user_id).order_by("-created_at")
237
        shortlistings = SavedListing.objects.filter(rentee_id__user=user_id).order_by(
×
238
            "-saved_listings__created_at"
239
        )
240
        paginator = Paginator(shortlistings, 10)
×
241
        page_number = self.request.GET.get("page")
×
242
        latest_listings_page = paginator.get_page(page_number)
×
243
        return latest_listings_page
×
244

245
    def get_context_data(self, **kwargs: Any):
1✔
246
        context_data = super().get_context_data(**kwargs)
×
NEW
247
        user_id = self.request.user.id
×
248
        context_data["user_id"] = user_id
×
NEW
249
        context_data["user"] = self.request.user
×
250
        context_data["path"] = self.request.path_info.__contains__("renter")
×
251
        context_data["inbox"] = get_inbox_count(User.objects.get(id=user_id).username)
×
252
        return context_data
×
253

254

255
@method_decorator(login_required, name="dispatch")
1✔
256
class ListingDetailView(generic.DetailView):
1✔
257
    model = Listing
1✔
258
    template_name = "rrapp/listing_detail.html"
1✔
259

260
    def get_context_data(self, **kwargs: Any):
1✔
261
        context_data = super().get_context_data(**kwargs)
1✔
262
        user_id = self.request.user.id
1✔
263
        context_data["user_id"] = user_id
1✔
264
        context_data["user"] = self.request.user
1✔
265
        context_data["path"] = self.request.path_info.__contains__("renter")
1✔
266
        context_data["photos"] = Photo.objects.filter(listing=self.kwargs["pk"])
1✔
267
        context_data["inbox"] = get_inbox_count(User.objects.get(id=user_id).username)
1✔
268
        return context_data
1✔
269

270

271
@method_decorator(login_required, name="dispatch")
1✔
272
class ListingDetailRenteeView(generic.DetailView):
1✔
273
    model = Listing
1✔
274
    template_name = "rrapp/rentee_listing_detail.html"
1✔
275

276
    def get_context_data(self, **kwargs: Any):
1✔
277
        context_data = super().get_context_data(**kwargs)
1✔
278
        user_id = self.request.user.id
1✔
279
        context_data["user_id"] = user_id
1✔
280
        context_data["user"] = User.objects.get(id=user_id)
1✔
281
        context_data["path"] = self.request.path_info.__contains__("renter")
1✔
282
        context_data["saved"] = self.check_state(user_id, self.kwargs["pk"])
1✔
283
        context_data["cur_permission"] = self.cur_permission(user_id, self.kwargs["pk"])
1✔
284
        context_data["photos"] = Photo.objects.filter(listing=self.kwargs["pk"])
1✔
285
        context_data["inbox"] = get_inbox_count(User.objects.get(id=user_id).username)
1✔
286
        return context_data
1✔
287

288
    def check_state(self, user_id, listing_id):
1✔
289
        # print(user_id, listing_id)
290
        if SavedListing.objects.filter(
1✔
291
            rentee_id__user=user_id, saved_listings=listing_id
292
        ).exists():
293
            return True
×
294
        else:
295
            return False
1✔
296

297
    def cur_permission(self, user_id, listing_id):
1✔
298
        # print(user_id, listing_id)
299
        listing = Listing.objects.get(id=listing_id)
1✔
300
        cur_user = User.objects.get(id=user_id)
1✔
301
        try:
1✔
302
            p = list(
1✔
303
                DirectMessagePermission.objects.filter(
304
                    sender=cur_user, receiver=listing.user
305
                )
306
            )
307

308
            p_equivalent = list(
1✔
309
                DirectMessagePermission.objects.filter(
310
                    receiver=cur_user, sender=listing.user
311
                )
312
            )
313
        except DirectMessagePermission.DoesNotExist:
×
314
            p = None
×
315

316
        if len(p) > 0:
1✔
317
            print(p[0].permission)
×
318
            return p[0].permission
×
319
        else:
320
            if len(p_equivalent) > 0:
1✔
321
                return p_equivalent[0].permission
×
322
            return None
1✔
323

324
    def post(self, request, *args, **kwargs):
1✔
325
        listing_id = self.kwargs["pk"]
1✔
326
        user_id = request.user.id
1✔
327
        save_state = self.check_state(user_id, listing_id)
1✔
328
        if "shortlist" in request.POST:
1✔
329
            if save_state:
1✔
330
                SavedListing.objects.filter(
×
331
                    rentee_id__user=user_id, saved_listings=listing_id
332
                ).delete()
333
            else:
334
                rentee = Rentee.objects.get(user=user_id)
1✔
335
                listing = Listing.objects.get(id=listing_id)
1✔
336
                SavedListing.objects.create(rentee_id=rentee, saved_listings=listing)
1✔
337

338
        if "connection_request" in request.POST:
1✔
339
            listing = Listing.objects.get(id=listing_id)
1✔
340
            cur_user = User.objects.get(id=user_id)
1✔
341
            try:
1✔
342
                p = list(
1✔
343
                    DirectMessagePermission.objects.filter(
344
                        sender=cur_user, receiver=listing.user
345
                    )
346
                )
347
            except DirectMessagePermission.DoesNotExist:
×
348
                p = None
×
349

350
            if len(p) > 0:
1✔
351
                print("permission already exists", p)
1✔
352
            else:
353
                # create DirectMessagePermission object in db
354
                print("creating permission")
1✔
355
                DirectMessagePermission.objects.create(
1✔
356
                    sender=cur_user,
357
                    receiver=listing.user,
358
                    permission=Permission.REQUESTED,
359
                )
360

361
        return HttpResponseRedirect(request.path_info)  # redirect to the same page
1✔
362

363

364
@method_decorator(login_required, name="dispatch")
1✔
365
class ListingResultsView(generic.ListView):
1✔
366
    template_name = "rrapp/rentee_listings.html"
1✔
367
    context_object_name = "queried_listings_page"
1✔
368

369
    def get_queryset(self):
1✔
370
        all_listings = Listing.objects.all().order_by("-created_at")
1✔
371
        sort_option = self.request.GET.get("sort", "created_at")
1✔
372

373
        # Extract the sorting order (Low to High or High to Low)
374
        sorting_order = ""  # Default to ascending order
1✔
375
        if sort_option.startswith("-"):
1✔
376
            sort_option = sort_option[1:]
×
377
            sorting_order = "-"  # Set to descending order
×
378

379
        # Apply sorting
380
        if sort_option not in [
1✔
381
            "monthly_rent",
382
            "number_of_bedrooms",
383
            "number_of_bathrooms",
384
        ]:
385
            sort_option = "created_at"
1✔
386
        all_listings = all_listings.order_by(f"{sorting_order}{sort_option}")
1✔
387

388
        # Apply filters
389
        filters = Q()
1✔
390

391
        monthly_rent = self.request.GET.get("monthly_rent")
1✔
392
        if monthly_rent:
1✔
393
            filters &= Q(monthly_rent__lte=monthly_rent)
1✔
394

395
        number_of_bedrooms = self.request.GET.get("number_of_bedrooms")
1✔
396
        if number_of_bedrooms:
1✔
397
            filters &= Q(number_of_bedrooms__lte=number_of_bedrooms)
1✔
398

399
        number_of_bathrooms = self.request.GET.get("number_of_bathrooms")
1✔
400
        if number_of_bathrooms:
1✔
401
            filters &= Q(number_of_bathrooms__lte=number_of_bathrooms)
1✔
402

403
        washer = self.request.GET.get("washer")
1✔
404
        if washer == "on":
1✔
405
            filters &= Q(washer=True)
1✔
406

407
        dryer = self.request.GET.get("dryer")
1✔
408
        if dryer == "on":
1✔
409
            filters &= Q(dryer=True)
×
410

411
        utilities_included = self.request.GET.get("utilities_included")
1✔
412
        if utilities_included == "on":
1✔
413
            filters &= Q(utilities_included=True)
1✔
414

415
        furnished = self.request.GET.get("furnished")
1✔
416
        if furnished == "on":
1✔
417
            filters &= Q(furnished=True)
1✔
418

419
        dishwasher = self.request.GET.get("dishwasher")
1✔
420
        if dishwasher == "on":
1✔
421
            filters &= Q(dishwasher=True)
1✔
422

423
        parking = self.request.GET.get("parking")
1✔
424
        if parking == "on":
1✔
425
            filters &= Q(parking=True)
1✔
426

427
        room_type = self.request.GET.get("room_type")
1✔
428
        if room_type:
1✔
429
            filters &= Q(room_type=room_type)
1✔
430

431
        food_groups_allowed = self.request.GET.get("food_groups_allowed")
1✔
432
        if food_groups_allowed:
1✔
433
            filters &= Q(food_groups_allowed=food_groups_allowed)
1✔
434

435
        pets_allowed = self.request.GET.get("pets_allowed")
1✔
436
        if pets_allowed:
1✔
437
            filters &= Q(pets_allowed=pets_allowed)
1✔
438

439
        # Continue filtering for other fields if needed
440

441
        # Combine filters
442
        all_listings = all_listings.filter(filters)
1✔
443

444
        paginator = Paginator(all_listings, 10)
1✔
445
        page_number = self.request.GET.get("page")
1✔
446
        queried_listings_page = paginator.get_page(page_number)
1✔
447
        return queried_listings_page
1✔
448

449
    def get_context_data(self, **kwargs: Any):
1✔
450
        context_data = super().get_context_data(**kwargs)
1✔
451
        user_id = self.request.user.id
1✔
452
        context_data["user_id"] = user_id
1✔
453
        context_data["user"] = self.request.user
1✔
454
        context_data["path"] = self.request.path_info.__contains__("renter")
1✔
455
        context_data["inbox"] = get_inbox_count(self.request.user.username)
1✔
456
        return context_data
1✔
457

458

459
@method_decorator(login_required, name="dispatch")
1✔
460
class ListingUpdateView(generic.UpdateView):
1✔
461
    model = Listing
1✔
462
    template_name = "rrapp/listing_detail_modify.html"
1✔
463
    form_class = ListingForm
1✔
464
    success_url = "rrapp:listing_detail"
1✔
465

466
    def get_success_url(self):
1✔
467
        listing_id = self.kwargs["pk"]
×
NEW
468
        return reverse("rrapp:listing_detail", args=(listing_id,))
×
469

470
    def get(self, request, *args, **kwargs):
1✔
471
        self.object = self.get_object()
×
472
        return super().get(request, *args, **kwargs)
×
473

474
    def get_object(self, queryset=None):
1✔
475
        return Listing.objects.get(id=self.kwargs["pk"])
×
476

477
    def get_context_data(self, **kwargs: Any):
1✔
478
        context_data = super().get_context_data(**kwargs)
×
NEW
479
        context_data["user_id"] = self.request.user.id
×
480
        context_data["listing_id"] = self.kwargs["pk"]
×
481
        context_data["list_title"] = Listing.objects.get(id=self.kwargs["pk"]).title
×
NEW
482
        context_data["user"] = self.request.user
×
483
        context_data["path"] = self.request.path_info.__contains__("renter")
×
NEW
484
        context_data["inbox"] = get_inbox_count(self.request.user.username)
×
UNCOV
485
        context_data['google_api_key'] = settings.GOOGLE_API_KEY
×
486
        context_data['base_country'] = settings.BASE_COUNTRY
×
487
        return context_data
×
488

489
    def post(self, request, *args, **kwargs):
1✔
490
        self.object = self.get_object()
×
491
        form = self.get_form()
×
492
        if form.is_valid():
×
493
            listing = form.save()
×
494
            existing_photos_pks = request.POST.getlist('existing_photos')
×
495
            Photo.objects.filter(listing=listing).exclude(
×
496
                pk__in=existing_photos_pks
497
            ).delete()
498
            listing.save()
×
499
            for file in request.FILES.getlist('add_photos'):
×
500
                Photo.objects.create(image=file, listing=listing)
×
501
            return self.form_valid(form)
×
502
        else:
503
            return self.form_invalid(form)
×
504

505

506
@method_decorator(login_required, name="dispatch")
1✔
507
class ListingNewView(generic.CreateView):
1✔
508
    model = Listing
1✔
509
    template_name = "rrapp/listing_new.html"
1✔
510
    form_class = ListingForm
1✔
511
    success_url = "rrapp:my_listings"
1✔
512

513
    def get(self, request, *args, **kwargs):
1✔
514
        self.object = self.get_object()
×
515
        return super().get(request, *args, **kwargs)
×
516

517
    def get_object(self, queryset=None):
1✔
518
        return self.request.user
×
519

520
    def get_success_url(self):
1✔
NEW
521
        return reverse("rrapp:listing_new")
×
522

523
    def get_context_data(self, **kwargs: Any):
1✔
524
        context_data = super().get_context_data(**kwargs)
×
NEW
525
        context_data["user_id"] = self.request.user.id
×
NEW
526
        context_data["user"] = self.request.user
×
527
        context_data["path"] = self.request.path_info.__contains__("renter")
×
NEW
528
        context_data["inbox"] = get_inbox_count(self.request.user.username)
×
UNCOV
529
        context_data['google_api_key'] = settings.GOOGLE_API_KEY
×
530
        context_data['base_country'] = settings.BASE_COUNTRY
×
531

532
        return context_data
×
533

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

537
        Args:
538
            request (HttpRequest): http request object
539

540
        Returns:
541
            HttpResponse: redirect or login view with error hints
542
        """
543
        self.object = self.get_object()
×
544
        form = self.get_form()
×
545

UNCOV
546
        if form.is_valid():
×
547
            form_data = form.cleaned_data
×
548

549
            listing = Listing.objects.create(
×
550
                user=request.user,
551
                status=form_data.get("status"),
552
                title=form_data.get("title"),
553
                description=form_data.get("description"),
554
                monthly_rent=form_data.get("monthly_rent"),
555
                date_available_from=form_data.get("date_available_from"),
556
                date_available_to=form_data.get("date_available_to"),
557
                property_type=form_data.get("property_type"),
558
                room_type=form_data.get("room_type"),
559
                address1=form_data.get("address1"),
560
                address2=form_data.get("address2"),
561
                zip_code=form_data.get("zip_code"),
562
                city=form_data.get("city"),
563
                country=form_data.get("country"),
564
                washer=form_data.get("washer") == "true",
565
                dryer=form_data.get("dryer") == "true",
566
                dishwasher=form_data.get("dishwasher") == "true",
567
                microwave=form_data.get("microwave") == "true",
568
                baking_oven=form_data.get("baking_oven") == "true",
569
                parking=form_data.get("parking") == "true",
570
                number_of_bedrooms=form_data.get("number_of_bedrooms"),
571
                number_of_bathrooms=form_data.get("number_of_bathrooms"),
572
                furnished=form_data.get("furnished") == "true",
573
                utilities_included=form_data.get("utilities_included") == "true",
574
                smoking_allowed=form_data.get("smoking_allowed") == "true",
575
                pets_allowed=form_data.get("pets_allowed"),
576
                food_groups_allowed=form_data.get("food_groups_allowed"),
577
                age_range=NumericRange(
578
                    int(form_data.get("age_range").lower),
579
                    int(form_data.get("age_range").upper),
580
                ),
581
            )
582
            listing.save()
×
583
            for file in request.FILES.getlist('add_photos'):
×
584
                Photo.objects.create(image=file, listing=listing)
×
NEW
585
            return HttpResponseRedirect(reverse("rrapp:my_listings"))
×
586
        else:
587
            return self.form_invalid(form)
×
588

589

590
@method_decorator(login_required, name='dispatch')
1✔
591
class ProfileView(generic.UpdateView):
1✔
592
    model = User
1✔
593
    template_name = "rrapp/profile.html"
1✔
594
    form_class = UserForm
1✔
595
    success_url = 'rrapp:profile'
1✔
596

597
    def get(self, request, *args, **kwargs):
1✔
598
        self.object = self.get_object()
×
599
        return super().get(request, *args, **kwargs)
×
600

601
    def get_object(self, queryset=None):
1✔
NEW
602
        return self.request.user
×
603

604
    def get_context_data(self, **kwargs: Any):
1✔
605
        context_data = super().get_context_data(**kwargs)
×
NEW
606
        context_data["user_id"] = self.request.user.id
×
NEW
607
        context_data["user"] = self.request.user
×
608
        context_data["path"] = self.request.path_info.__contains__("renter")
×
NEW
609
        context_data["inbox"] = get_inbox_count(self.request.user.username)
×
UNCOV
610
        return context_data
×
611

612
    def get_success_url(self):
1✔
NEW
613
        return reverse('rrapp:profile')
×
614

615
    def post(self, request, *args, **kwargs):
1✔
616
        self.object = self.get_object()
×
617
        form = self.get_form()
×
618
        if form.is_valid():
×
619
            return self.form_valid(form)
×
620
        else:
621
            return self.form_invalid(form)
×
622

623

624
@method_decorator(login_required, name='dispatch')
1✔
625
class PublicProfileView(generic.DetailView):
1✔
626
    model = User
1✔
627
    template_name = "rrapp/public_profile.html"
1✔
628
    fields = [
1✔
629
        'username',
630
        'first_name',
631
        'last_name',
632
        'bio',
633
        'smokes',
634
        'pets',
635
        'food_group',
636
    ]
637

638
    def get_context_data(self, **kwargs: Any):
1✔
639
        context_data = super().get_context_data(**kwargs)
×
640
        context_data["user_id"] = self.kwargs["pk"]
×
641
        context_data["user"] = User.objects.get(id=self.kwargs["pk"])
×
642
        context_data["path"] = self.request.path_info.__contains__("renter")
×
643
        context_data["inbox"] = get_inbox_count(
×
644
            User.objects.get(id=self.kwargs["pk"]).username
645
        )
646
        return context_data
×
647

648
    def get_success_url(self):
1✔
NEW
649
        return reverse('rrapp:rentee_listings')
×
650

651

652
@login_required
1✔
653
def listing_delete(request, pk):
1✔
NEW
654
    listing = get_object_or_404(Listing, pk=pk, user_id=request.user.id)
×
655

656
    if request.method == 'POST':
×
657
        listing.delete()
×
658
        # Always return an HttpResponseRedirect after successfully dealing
659
        # with POST data. This prevents data from being posted twice if a
660
        # user hits the Back button.
NEW
661
        return HttpResponseRedirect(reverse('rrapp:my_listings'))
×
662
    return render(
×
663
        request,
664
        'rrapp/confirm_delete_listing.html',
665
        {"user_id": request.user.id, "pk": pk},
666
    )
667

668

669
@login_required
1✔
670
def deleteAccount(request):
1✔
NEW
671
    user = get_object_or_404(User, pk=request.user.id)
×
672
    if request.method == 'POST':
×
673
        user.delete()
×
674
        logout(request)
×
675
        return HttpResponseRedirect(reverse('rrapp:home'))
×
NEW
676
    return render(
×
677
        request, 'rrapp/confirm_delete_user.html', {"user_id": request.user.id}
678
    )
679

680

681
class UsersListView(LoginRequiredMixin, generic.ListView):
1✔
682
    http_method_names = [
1✔
683
        'get',
684
    ]
685

686
    def get_queryset(self):
1✔
687
        return User.objects.all().exclude(id=self.request.user.id)
×
688

689
    def render_to_response(self, context, **response_kwargs):
1✔
690
        users: List[AbstractBaseUser] = context['object_list']
×
691

692
        data = [{"username": usr.get_username(), "pk": str(usr.pk)} for usr in users]
×
693
        return JsonResponse(data, safe=False, **response_kwargs)
×
694

695

696
def get_inbox_count(username):
1✔
697
    i = 0
1✔
698
    i += get_pending_connections_count(username)
1✔
699
    return i
1✔
700

701

702
def rrapp_403(request, exception):
1✔
NEW
703
    return render(request, "rrapp/403.html", {}, status=403)
×
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