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

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

03 Nov 2025 03:34PM UTC coverage: 56.582% (+7.8%) from 48.812%
55

push

travis-pro

web-flow
Syncing the develop and main branch

Syncing Prod and Dev

201 of 388 new or added lines in 11 files covered. (51.8%)

5 existing lines in 1 file now uncovered.

447 of 790 relevant lines covered (56.58%)

0.57 hits per line

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

92.45
/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
1✔
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
    # ADD THIS: Model information field
54
    information = models.TextField(blank=True, null=True)
1✔
55

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

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

75
    # Soft delete fields
76
    is_deleted = models.BooleanField(default=False)
1✔
77
    deleted_at = models.DateTimeField(null=True, blank=True)
1✔
78
    # Store version number permanently
79
    version_number = models.IntegerField(default=1)
1✔
80

81
    class Meta:
1✔
82
        ordering = ["-created_at"]
1✔
83

84
    def save(self, *args, **kwargs):
1✔
85
        # Auto-generate version number for new versions only
86
        if not self.pk:  # Only for new objects
1✔
87
            from django.db.models import Max
1✔
88

89
            # Get the highest version number for this upload
90
            last_version = ModelVersion.objects.filter(upload=self.upload).aggregate(
1✔
91
                Max("version_number")
92
            )["version_number__max"]
93
            self.version_number = (last_version or 0) + 1
1✔
94
        super().save(*args, **kwargs)
1✔
95

96
    def get_version_number(self):
1✔
97
        """Keep this method for backwards compatibility"""
NEW
98
        return self.version_number
×
99

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