Changeset aaaa4b8 in flexograder for builder/exam_elements.py


Ignore:
Timestamp:
11/19/25 11:56:24 (5 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
fake-data, main, master
Children:
0792ddd
Parents:
7cc3672
Message:

flexograder entities updated to reflect changes on FlexoEntity

File:
1 edited

Legend:

Unmodified
Added
Removed
  • builder/exam_elements.py

    r7cc3672 raaaa4b8  
    55from dataclasses import dataclass, field
    66from flexoentity import FlexoEntity, EntityType, EntityState, FlexOID, logger
    7 from .media_items import MediaItem, NullMediaItem, DownloadItem
     7from builder.media_items import MediaItem, NullMediaItem, DownloadItem, media_factory
    88
    99
     
    4747    text: str = ""
    4848    topic: str = ""
    49     media: List[MediaItem] = field(default_factory=lambda: [NullMediaItem()])
     49    media: List[MediaItem] = field(default_factory=lambda: [])
    5050
    5151    @classmethod
    5252    def default(cls):
    53         return cls()
     53        return cls.with_domain_id(domain_id="DEF_DEFAULT")
    5454
    5555    @property
     
    9898    def media_to_html(self, prefix="media/") -> str:
    9999        return "".join([m.to_html(prefix=prefix) for m in self.media if m])
     100
     101    @classmethod
     102    def from_dict(cls, data):
     103        if "flexo_id" not in data:
     104            raise ValueError("Question is missing flexo_id")
     105
     106        flexo_id = FlexOID(data["flexo_id"])
     107
     108        # NOTE: cls(...) will call the correct subclass constructor
     109        obj = cls(
     110            text=data.get("text", ""),
     111            topic=data.get("topic", ""),
     112            flexo_id=flexo_id,
     113        )
     114
     115        # restore provenance
     116        obj.fingerprint = data.get("fingerprint", "")
     117        obj.origin = data.get("origin")
     118        if data.get("originator_id"):
     119            obj.originator_id = UUID(data["originator_id"])
     120        if data.get("owner_id"):
     121            obj.owner_id = UUID(data["owner_id"])
     122
     123        return obj
    100124
    101125    def to_dict(self):
     
    105129            "qtype": self.qtype,  # avoid name clash with built-in type
    106130            "text": self.text,
    107             "media": [m.to_dict() for m in self.media if not isinstance(m, NullMediaItem)],
     131            "media": [m.to_dict() for m in self.media],
    108132            "state": self.state.name,  # explicit readable form
    109133        })
     
    111135
    112136    def has_media(self):
    113         return any(not isinstance(item, NullMediaItem) for item in self.media)
     137        return any(item for item in self.media)
    114138
    115139    def get_media(self):
    116         return [item for item in self.media if not isinstance(item, NullMediaItem)]
     140        return [item for item in self.media]
    117141
    118142
     
    154178        return d
    155179
     180    @classmethod
     181    def from_dict(cls, data):
     182        obj = super().from_dict(data)
     183        obj.media = [media_factory(m) for m in data.get("media", [])]
     184        return obj
     185
    156186
    157187@dataclass
     
    187217        })
    188218        return base
     219
     220    @classmethod
     221    def from_dict(cls, data):
     222        obj = super().from_dict(data)
     223        obj.options = [
     224            AnswerOption(o["id"], o["text"], o.get("points", 0.0))
     225            for o in data.get("options", [])
     226        ]
     227
     228        obj.media = [media_factory(m) for m in data.get("media", [])]
     229        return obj
    189230
    190231    def points_for(self, option_id):
     
    280321
    281322    @classmethod
    282     def from_dict(cls, data: dict) -> "TextQuestion":
    283         validation = None
    284         if "validation" in data and isinstance(data["validation"], dict):
    285             validation = Validation(**data["validation"])
     323    def from_dict(cls, data):
    286324        obj = super().from_dict(data)
    287         obj.validation = validation
     325        v = data.get("validation")
     326        obj.validation = Validation(**v) if v else None
     327        obj.media = [media_factory(m) for m in data.get("media", [])]
    288328        return obj
    289329
     
    363403        return d
    364404
    365     @staticmethod
    366     def from_dict(data: dict) -> "CandidateIDQuestion":
    367         q = CandidateIDQuestion(text=data["text"],
    368                                 topic=data.get("topic", ""),
    369                                 fields=data.get("fields", []),
    370         )
    371         flexo_id = data.get("id",
    372                        FlexOID.safe_generate(domain="SYS",
    373                                              entity_type=EntityType.ITEM,
    374                                              entity_state=EntityState.DRAFT,
    375                                              ))
    376         q.flexo_id = flexo_id
    377         return q
     405    @classmethod
     406    def from_dict(cls, data):
     407        obj = super().from_dict(data)
     408        obj.fields = data.get("fields", [])
     409        obj.media = [media_factory(m) for m in data.get("media", [])]
     410        return obj
    378411
    379412@dataclass
Note: See TracChangeset for help on using the changeset viewer.