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

gcivil-nyu-org / team4-wed-spring25 / 286

19 Mar 2025 11:00PM UTC coverage: 95.573% (+0.02%) from 95.55%
286

cron

travis-pro

web-flow
Merge pull request #158 from gcivil-nyu-org/develop

Develop

3 of 4 new or added lines in 1 file covered. (75.0%)

367 of 384 relevant lines covered (95.57%)

0.96 hits per line

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

87.01
/parks/views.py
1
from django.shortcuts import render, get_object_or_404, redirect
1✔
2
from django.http import HttpResponse  # noqa: F401  # Ignore "imported but unused"
1✔
3
from .models import DogRunNew, Review, ParkImage
1✔
4

5
import folium
1✔
6
from folium.plugins import MarkerCluster
1✔
7

8
from .utilities import folium_cluster_styling
1✔
9

10
from django.contrib.auth import login
1✔
11
from .forms import RegisterForm
1✔
12
import json
1✔
13

14

15
def register_view(request):
1✔
16
    if request.method == "POST":
1✔
17
        form = RegisterForm(request.POST)
1✔
18
        if form.is_valid():
1✔
19
            user = form.save()  # Save user
1✔
20
            login(request, user)  # Log in the user immediately
1✔
21
            request.session.save()  # Ensure session is updated
1✔
22
            return redirect("home")  # Redirect to homepage
1✔
23
    else:
24
        form = RegisterForm()
1✔
25

26
    return render(request, "parks/register.html", {"form": form})
1✔
27

28

29
def park_list(request):
1✔
30
    parks = DogRunNew.objects.all()  # Fetch all dog runs from the database
1✔
31
    return render(request, "parks/park_list.html", {"parks": parks})
1✔
32

33

34
def home_view(request):
1✔
35
    return render(request, "parks/home.html")
1✔
36

37

38
def map(request):
1✔
39

40
    NYC_LAT_AND_LONG = (40.730610, -73.935242)
1✔
41
    # Create map centered on NYC
42
    m = folium.Map(location=NYC_LAT_AND_LONG, zoom_start=11)
1✔
43

44
    icon_create_function = folium_cluster_styling("rgb(0, 128, 0)")
1✔
45

46
    marker_cluster = MarkerCluster(icon_create_function=icon_create_function).add_to(m)
1✔
47

48
    # Fetch all dog runs from the database
49
    parks = DogRunNew.objects.all()
1✔
50

51
    # Mark every park on the map
52
    for park in parks:
1✔
53
        park_name = park.name
×
54

55
        folium.Marker(
×
56
            location=(park.latitude, park.longitude),
57
            icon=folium.Icon(icon="dog", prefix="fa", color="green"),
58
            popup=folium.Popup(park_name, max_width=200),
59
        ).add_to(marker_cluster)
60

61
    # represent map as html
62
    context = {"map": m._repr_html_()}
1✔
63
    return render(request, "parks/map.html", context)
1✔
64

65

66
def park_and_map(request):
1✔
67
    # Get filter values from GET request
68
    filter_value = request.GET.get("filter", "")
1✔
69
    accessible_value = request.GET.get("accessible", "")
1✔
70

71
    # Fetch all dog runs from the database
72
    parks = DogRunNew.objects.all().order_by("id")
1✔
73

74
    if filter_value:
1✔
75
        parks = parks.filter(dogruns_type__icontains=filter_value)
×
76

77
    if accessible_value:
1✔
78
        parks = parks.filter(accessible=accessible_value)
×
79

80
    parks_json = json.dumps(list(parks.values()))
1✔
81

82
    NYC_LAT_AND_LONG = (40.712775, -74.005973)
1✔
83

84
    # Create map centered on NYC
85
    # f = folium.Figure(height="100")
86
    m = folium.Map(location=NYC_LAT_AND_LONG, zoom_start=11)
1✔
87

88
    icon_create_function = folium_cluster_styling("rgba(0, 128, 0, 0.7)")
1✔
89
    marker_cluster = MarkerCluster(
1✔
90
        icon_create_function=icon_create_function,
91
        # maxClusterRadius=10,
92
    ).add_to(m)
93

94
    # Mark every park on the map
95
    for park in parks:
1✔
96
        park_name = park.name
×
NEW
97
        break
×
98

99
        folium.Marker(
100
            location=(park.latitude, park.longitude),
101
            icon=folium.Icon(icon="dog", prefix="fa", color="green"),
102
            popup=folium.Popup(park_name, max_width=200),
103
        ).add_to(marker_cluster)
104

105
    m = m._repr_html_()
1✔
106
    m = m.replace(
1✔
107
        '<div style="width:100%;">'
108
        + '<div style="position:relative;width:100%;height:0;padding-bottom:60%;">',
109
        '<div style="width:100%; height:100vh;">'
110
        + '<div style="position:relative;width:100%;height:100%;>',
111
        1,
112
    )
113

114
    # Render map as HTML
115
    return render(
1✔
116
        request,
117
        "parks/combined_view.html",
118
        {"parks": parks, "map": m, "parks_json": parks_json},
119
    )
120

121

122
def park_detail(request, id):
1✔
123
    park = get_object_or_404(DogRunNew, id=id)  # Get the park by id
1✔
124
    images = ParkImage.objects.filter(
1✔
125
        park=park
126
    )  # Retrieve all images related to this park
127
    reviews = park.reviews.all()  # Retrieve all reviews related to this park
1✔
128

129
    if request.method == "POST":
1✔
130
        form_type = request.POST.get("form_type")  # Determine which form is submitted
1✔
131

132
        # Handle multiple image uploads
133
        if form_type == "upload_image" and request.FILES.getlist("images"):
1✔
134
            for image in request.FILES.getlist("images"):
×
135
                ParkImage.objects.create(park=park, image=image)
×
136
            return redirect("park_detail", id=park.id)  # Redirect after upload
×
137

138
        # Handle review submission separately
139
        elif form_type == "submit_review":
1✔
140
            review_text = request.POST.get("text", "").strip()
1✔
141
            rating_value = request.POST.get("rating", "").strip()
1✔
142

143
            if not rating_value.isdigit():
1✔
144
                return render(
×
145
                    request,
146
                    "parks/park_detail.html",
147
                    {
148
                        "park": park,
149
                        "images": images,
150
                        "reviews": reviews,
151
                        "error_message": "Please select a valid rating!",
152
                    },
153
                )
154

155
            rating = int(rating_value)
1✔
156
            if rating < 1 or rating > 5:
1✔
157
                return render(
1✔
158
                    request,
159
                    "parks/park_detail.html",
160
                    {
161
                        "park": park,
162
                        "images": images,
163
                        "reviews": reviews,
164
                        "error_message": "Rating must be between 1 and 5 stars!",
165
                    },
166
                )
167

168
            Review.objects.create(park=park, text=review_text, rating=rating)
1✔
169
            return redirect(
1✔
170
                "park_detail", id=park.id
171
            )  # Redirect after review submission
172

173
    return render(
1✔
174
        request,
175
        "parks/park_detail.html",
176
        {"park": park, "images": images, "reviews": reviews},
177
    )
178

179

180
def contact_view(request):
1✔
181
    return render(request, "parks/contact.html")
1✔
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

© 2026 Coveralls, Inc