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

scoringengine / scoringengine / 23385248069

21 Mar 2026 05:50PM UTC coverage: 73.202% (-2.5%) from 75.69%
23385248069

push

github

RustyBower
Fix test to match DB fallback behavior for missing output files

The endpoint now returns check.output from DB (200) instead of 404
when the on-disk file doesn't exist.

3726 of 5090 relevant lines covered (73.2%)

0.73 hits per line

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

96.23
/scoring_engine/models/flag.py
1
import html
1✔
2

3
import pytz
1✔
4
from sqlalchemy import Boolean, Column, DateTime, Enum, ForeignKey, Integer, PickleType, String, UniqueConstraint
1✔
5

6
# from sqlalchemy.dialects.postgresql import UUID
7
from sqlalchemy.orm import relationship
1✔
8

9

10
def _ensure_utc_aware(dt):
1✔
11
    """Ensure datetime is timezone-aware in UTC. Handles both naive and aware datetimes."""
12
    if dt is None:
1✔
13
        return None
×
14
    if dt.tzinfo is None:
1✔
15
        # Naive datetime - assume UTC
16
        return pytz.utc.localize(dt)
1✔
17
    # Already aware - convert to UTC
18
    return dt.astimezone(pytz.utc)
×
19

20

21
import enum
1✔
22
import uuid
1✔
23

24
from scoring_engine.config import config
1✔
25
from scoring_engine.models.base import Base
1✔
26
from scoring_engine.models.team import Team
1✔
27

28

29
class FlagTypeEnum(enum.Enum):
1✔
30
    file = "file"
1✔
31
    pipe = "pipe"
1✔
32
    net = "net"
1✔
33
    reg = "reg"
1✔
34

35

36
class Platform(enum.Enum):
1✔
37
    windows = "win"
1✔
38
    nix = "nix"
1✔
39

40

41
class Perm(enum.Enum):
1✔
42
    user = "user"
1✔
43
    root = "root"
1✔
44

45

46
class Flag(Base):
1✔
47
    __tablename__ = "flags"
1✔
48
    # id = Column(Integer, primary_key=True, autoincrement=True)
49
    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
1✔
50
    type = Column(Enum(FlagTypeEnum), nullable=False)
1✔
51
    platform = Column(Enum(Platform), nullable=False)
1✔
52
    data = Column(PickleType, nullable=False)
1✔
53
    start_time = Column(DateTime(timezone=True), nullable=False)
1✔
54
    end_time = Column(DateTime(timezone=True), nullable=False)
1✔
55
    perm = Column(Enum(Perm), nullable=False)
1✔
56
    dummy = Column(Boolean, nullable=False, default=False)
1✔
57

58
    def as_dict(self) -> dict:
1✔
59
        return {
1✔
60
            "id": self.id,
61
            "type": self.type.value,
62
            "data": self.data,
63
            "platform": self.platform.value,
64
            "start_time": int(_ensure_utc_aware(self.start_time).timestamp()),
65
            "end_time": int(_ensure_utc_aware(self.end_time).timestamp()),
66
            "perm": self.perm.value,
67
            "dummy": self.dummy,
68
        }
69

70
    @property
1✔
71
    def localize_start_time(self):
1✔
72
        return (
1✔
73
            _ensure_utc_aware(self.start_time)
74
            .astimezone(pytz.timezone(config.timezone))
75
            .strftime("%Y-%m-%d %H:%M:%S %Z")
76
        )
77

78
    @property
1✔
79
    def localize_end_time(self):
1✔
80
        return (
1✔
81
            _ensure_utc_aware(self.end_time).astimezone(pytz.timezone(config.timezone)).strftime("%Y-%m-%d %H:%M:%S %Z")
82
        )
83

84

85
class Solve(Base):
1✔
86
    __tablename__ = "flag_solves"
1✔
87
    __table_args__ = (UniqueConstraint("flag_id", "host", "team_id", name="_flag_host_team_uc"),)
1✔
88
    id = Column(Integer, primary_key=True, autoincrement=True)
1✔
89
    host = Column(String(260), nullable=False)
1✔
90
    flag_id = Column(String(36), ForeignKey("flags.id"))
1✔
91
    team_id = Column(Integer, ForeignKey("teams.id"))
1✔
92
    flag = relationship("Flag", backref="solves", lazy="joined")
1✔
93
    team = relationship("Team", backref="flag_solves", lazy="joined")
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