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

gcivil-nyu-org / team4-wed-fall25 / 18

22 Oct 2025 08:01PM UTC coverage: 48.812%. Remained the same
18

api

travis-pro

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

Syncing main with develop branch

15 of 77 new or added lines in 5 files covered. (19.48%)

66 existing lines in 4 files now uncovered.

226 of 463 relevant lines covered (48.81%)

0.49 hits per line

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

84.21
/note2webapp/models.py
1
from django.db import models
1✔
2
from django.contrib.auth.models import User
1✔
3
from django.db.models.signals import post_save
1✔
4
from django.dispatch import receiver
1✔
5

6

7
# -----------------------
8
# USER PROFILE WITH ROLE
9
# -----------------------
10
class Profile(models.Model):
1✔
11
    ROLE_CHOICES = [
1✔
12
        ("uploader", "Model Uploader"),
13
        ("reviewer", "Model Reviewer"),
14
    ]
15
    user = models.OneToOneField(User, on_delete=models.CASCADE)
1✔
16
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default="uploader")
1✔
17

18
    def __str__(self):
1✔
UNCOV
19
        return f"{self.user.username} ({self.role})"
×
20

21

22
@receiver(post_save, sender=User)
1✔
23
def create_or_update_profile(sender, instance, created, **kwargs):
1✔
24
    """Automatically create or update Profile when User is created/updated"""
25
    if created:
×
UNCOV
26
        Profile.objects.create(user=instance)
×
27
    else:
UNCOV
28
        instance.profile.save()
×
29

30

31
# -----------------------
32
# MODEL UPLOAD + VERSION
33
# -----------------------
34
class ModelUpload(models.Model):
1✔
35
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="uploads")
1✔
36
    name = models.CharField(max_length=200)
1✔
37
    created_at = models.DateTimeField(auto_now_add=True)
1✔
38

39
    def __str__(self):
1✔
UNCOV
40
        return self.name
×
41

42

43
class ModelVersion(models.Model):
1✔
44
    upload = models.ForeignKey(
1✔
45
        ModelUpload, on_delete=models.CASCADE, related_name="versions"
46
    )
47
    model_file = models.FileField(upload_to="models/")
1✔
48
    predict_file = models.FileField(upload_to="predict/")
1✔
49
    schema_file = models.FileField(
1✔
50
        upload_to="schemas/", blank=True, null=True
51
    )  # for test data generation
52
    tag = models.CharField(max_length=100)
1✔
53

54
    category = models.CharField(
1✔
55
        max_length=50,
56
        choices=[
57
            ("research", "Research"),
58
            ("production", "Production"),
59
            ("testing", "Testing"),
60
        ],
61
        default="research",
62
    )
63

64
    status = models.CharField(
1✔
65
        max_length=20,
66
        choices=[("PENDING", "Pending"), ("PASS", "Pass"), ("FAIL", "Fail")],
67
        default="PENDING",
68
    )
69
    is_active = models.BooleanField(default=False)
1✔
70
    log = models.TextField(blank=True, null=True)
1✔
71
    created_at = models.DateTimeField(auto_now_add=True)
1✔
72

73
    # ADD THESE NEW FIELDS FOR SOFT DELETE
74
    is_deleted = models.BooleanField(default=False)
1✔
75
    deleted_at = models.DateTimeField(null=True, blank=True)
1✔
76

77
    class Meta:
1✔
78
        ordering = ["-created_at"]
1✔
79

80
    def __str__(self):
1✔
UNCOV
81
        return f"{self.upload.name} - v{self.id} ({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