def save(self, *args, **kwargs):
        if self.id is None:
            super(Lesson, self).save(*args, **kwargs)
            kwargs["force_update"] = True
            kwargs["force_insert"] = False

        agg_activities = curry(self.aggregate_activity_attr, self.activities.all())

        # These are normal fields, so we can set them before we save
        agg_pki = agg_activities("prior_knowledge_items")
        self.prior_knowledge = json.dumps(list(set(chain(*agg_pki))))
        self.accessibility_notes = list_as_ul(
            list(set(chain(*[ul_as_list(x) for x in agg_activities("accessibility_notes")])))
        )
        rsd = agg_activities("relevant_start_date")
        if rsd:
            self.relevant_start_date = min(rsd)
        red = agg_activities("relevant_end_date")
        if red:
            self.relevant_end_date = max(red)
        gt = agg_activities("geologic_time")
        if gt:
            self.geologic_time = min(gt)
        self.duration = self._calc_duration(self.activities.all())
        super(Lesson, self).save(*args, **kwargs)
        self._sync_m2m(self.eras, agg_activities("eras"))
        self._sync_m2m(self.subjects, agg_activities("subjects", ignore_own=True))
        self._sync_m2m(self.grades, agg_activities("grades", ignore_own=True))
        self._sync_m2m(self.physical_space_types, agg_activities("physical_space_types", ignore_own=True))
        self._sync_m2m(self.plugin_types, agg_activities("plugin_types", ignore_own=True))
        self._sync_m2m(self.tech_setup_types, agg_activities("tech_setup_types", ignore_own=True))
def reformat_prior_knowledge(apps, schema_editor):
    """
    Converts the HTML <ul> into a json array
    """
    Activity = apps.get_model("curricula", "Activity")  # NOQA
    Lesson = apps.get_model("curricula", "Lesson")  # NOQA

    for activity in Activity.objects.all():
        pk = activity.prior_knowledge or ""
        pk = pk.replace("\n", "")
        new_list = ul_as_list(pk)
        new_list = [x.strip() for x in new_list]
        activity.prior_knowledge = json.dumps([x for x in new_list if x])
        activity.save()

    for lesson in Lesson.objects.all():
        pk = lesson.prior_knowledge or ""
        pk = pk.replace("\n", "")
        new_list = ul_as_list(pk)
        new_list = [x.strip() for x in new_list]
        lesson.prior_knowledge = json.dumps([x for x in new_list if x])
        lesson.save()
 def get_setup(self, activities=None):
     activities = activities or self.activities.all()
     setup = [ul_as_list(activity.setup) for activity in activities]
     deduped_setup = set(setup)
     return list(deduped_setup)
 def get_accessibility(self, activities=None):
     if self.is_all_activities(activities):
         return self.accessibility_notes
     accessibility_notes = [ul_as_list(activity.accessibility_notes) for activity in activities]
     deduped_notes = set(accessibility_notes)
     return list(deduped_notes)