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

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

29 Oct 2025 06:35AM UTC coverage: 60.563% (+11.8%) from 48.812%
29

push

travis-pro

web-flow
Merge pull request #56 from gcivil-nyu-org/feature/validation-failure-handling

Feature/validation failure handling

88 of 136 new or added lines in 5 files covered. (64.71%)

1 existing line in 1 file now uncovered.

344 of 568 relevant lines covered (60.56%)

0.61 hits per line

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

87.76
/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✔
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:
1✔
26
        Profile.objects.create(user=instance)
1✔
27
    else:
28
        instance.profile.save()
1✔
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✔
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 get_version_number(self):
1✔
81
        if not self.pk:
1✔
NEW
82
            existing_count = (
×
83
                ModelVersion.objects.filter(
84
                    upload=self.upload, is_deleted=False
85
                ).count()
86
                if self.upload_id
87
                else 0
88
            )
NEW
89
            return existing_count + 1
×
90

91
        return (
1✔
92
            ModelVersion.objects.filter(
93
                upload=self.upload, is_deleted=False, pk__lt=self.pk
94
            ).count()
95
            + 1
96
        )
97

98
    def __str__(self):
1✔
99
        try:
1✔
100
            version_num = self.get_version_number()
1✔
101
            version_str = f"v{version_num}" if version_num else "v?"
1✔
102
            upload_name = getattr(self.upload, "name", "Unknown Upload")
1✔
103
            return f"{upload_name} - {version_str} ({self.status})"
1✔
NEW
104
        except Exception:
×
NEW
105
            return f"ModelVersion (unsaved) - {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