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

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

15 Apr 2025 09:04AM UTC coverage: 94.434% (-2.6%) from 96.987%
446

push

travis-pro

mr2447
test

1018 of 1078 relevant lines covered (94.43%)

0.94 hits per line

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

96.59
/parks/models.py
1
from django.db import models
1✔
2
from cloudinary.models import CloudinaryField
1✔
3
from django.contrib.auth.models import User
1✔
4
from django.utils import timezone
1✔
5
from django.utils.text import slugify
1✔
6

7

8
class DogRun(models.Model):
1✔
9
    id = models.CharField(max_length=255)
1✔
10
    prop_id = models.CharField(max_length=255, primary_key=True)
1✔
11
    name = models.CharField(max_length=255)
1✔
12
    address = models.CharField(max_length=255)
1✔
13
    dogruns_type = models.CharField(max_length=100)
1✔
14
    accessible = models.CharField(max_length=50)
1✔
15
    notes = models.TextField(max_length=255)
1✔
16
    image = models.ImageField(upload_to="dogruns/", null=True, blank=True)
1✔
17

18
    class Meta:
1✔
19
        db_table = "dog_runs"
1✔
20

21
    def __str__(self):
1✔
22
        return self.name
×
23

24

25
class DogRunNew(models.Model):
1✔
26
    id = models.CharField(max_length=255, primary_key=True)
1✔
27
    prop_id = models.CharField(max_length=255)
1✔
28
    name = models.CharField(max_length=255)
1✔
29
    address = models.CharField(max_length=255)
1✔
30
    dogruns_type = models.CharField(max_length=100)
1✔
31
    accessible = models.CharField(max_length=50)
1✔
32
    notes = models.TextField(max_length=255)
1✔
33
    google_name = models.TextField(null=True, blank=True)
1✔
34
    borough = models.TextField(null=True, blank=True)
1✔
35
    zip_code = models.TextField(null=True, blank=True)
1✔
36
    formatted_address = models.TextField(null=True, blank=True)
1✔
37
    latitude = models.FloatField(null=True, blank=True)
1✔
38
    longitude = models.FloatField(null=True, blank=True)
1✔
39
    additional = models.JSONField(null=True, blank=True)  # PostgreSQL JSONB
1✔
40
    display_name = models.TextField(null=False, blank=False)
1✔
41
    slug = models.SlugField(null=False, blank=False)
1✔
42

43
    class Meta:
1✔
44
        db_table = "dog_runs_new"
1✔
45

46
    def __str__(self):
1✔
47
        return self.name
×
48

49
    def save(self, *args, **kwargs):
1✔
50
        combined = f"{self.display_name}-{self.prop_id}"
1✔
51
        self.slug = slugify(combined)
1✔
52
        super().save(*args, **kwargs)
1✔
53

54

55
class Review(models.Model):
1✔
56
    park = models.ForeignKey(
1✔
57
        DogRunNew, on_delete=models.CASCADE, related_name="reviews"
58
    )
59
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="reviews")
1✔
60
    text = models.TextField()
1✔
61
    rating = models.IntegerField()
1✔
62
    created_at = models.DateTimeField(auto_now_add=True)
1✔
63

64
    class Meta:
1✔
65
        db_table = "park_reviews"
1✔
66
        ordering = ["-created_at"]
1✔
67

68
    def __str__(self):
1✔
69
        return f"Review for {self.park.name} ({self.rating} stars)"
1✔
70

71

72
class ParkImage(models.Model):
1✔
73
    park = models.ForeignKey(
1✔
74
        DogRunNew,
75
        on_delete=models.CASCADE,
76
        related_name="images",
77
        to_field="id",
78
        db_column="park_id",
79
    )
80
    user = models.ForeignKey(
1✔
81
        User, on_delete=models.CASCADE, related_name="images", null=True, blank=True
82
    )
83
    review = models.ForeignKey(
1✔
84
        "Review", on_delete=models.CASCADE, null=True, blank=True, related_name="images"
85
    )
86
    image = CloudinaryField("image")
1✔
87

88
    def __str__(self):
1✔
89
        return f"Image for {self.park.name}"
1✔
90

91

92
class ReviewReport(models.Model):
1✔
93
    review = models.ForeignKey(
1✔
94
        "Review", on_delete=models.CASCADE, related_name="reports"
95
    )
96
    reported_by = models.ForeignKey(User, on_delete=models.CASCADE)
1✔
97
    reason = models.TextField()
1✔
98
    reported_at = models.DateTimeField(default=timezone.now)
1✔
99

100
    def __str__(self):
1✔
101
        return f"Reported by {self.reported_by.username} on {self.review.id}"
1✔
102

103

104
class ImageReport(models.Model):
1✔
105
    user = models.ForeignKey(
1✔
106
        User, on_delete=models.CASCADE, related_name="image_reports"
107
    )
108
    image = models.ForeignKey(
1✔
109
        ParkImage, on_delete=models.CASCADE, related_name="reports"
110
    )
111
    reason = models.TextField()
1✔
112
    created_at = models.DateTimeField(auto_now_add=True)
1✔
113

114
    def __str__(self):
1✔
115
        return f"Report by {self.user.username} on Image {self.image.id}"
1✔
116

117

118
class ParkPresence(models.Model):
1✔
119
    STATUS_CHOICES = [
1✔
120
        ("Current", "Current"),
121
        ("On their way", "On their way"),
122
    ]
123

124
    user = models.ForeignKey(
1✔
125
        User, on_delete=models.CASCADE, related_name="park_presences"
126
    )
127
    park = models.ForeignKey(
1✔
128
        DogRunNew, on_delete=models.CASCADE, related_name="presences"
129
    )
130
    status = models.CharField(max_length=20, choices=STATUS_CHOICES)
1✔
131

132
    # This is now the proper datetime for scheduled arrival
133
    time = models.DateTimeField(null=True, blank=True)
1✔
134

135
    checked_in_at = models.DateTimeField(auto_now_add=True)
1✔
136

137
    class Meta:
1✔
138
        db_table = "park_presence"
1✔
139
        unique_together = ("user", "park")
1✔
140
        ordering = ["-checked_in_at"]
1✔
141

142
    def __str__(self):
1✔
143
        return f"{self.user.username} - {self.park.display_name} ({self.status})"
×
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