Aller au contenu

Models

Club

Bases: Model

The Club class, made as a tree to allow nice tidy organization.

president()

Fetch the membership of the current president of this club.

Source code in club/models.py
@cached_property
def president(self) -> Membership | None:
    """Fetch the membership of the current president of this club."""
    return self.members.filter(
        role=settings.SITH_CLUB_ROLES_ID["President"], end_date=None
    ).first()

check_loop()

Raise a validation error when a loop is found within the parent list.

Source code in club/models.py
def check_loop(self):
    """Raise a validation error when a loop is found within the parent list."""
    objs = []
    cur = self
    while cur.parent is not None:
        if cur in objs:
            raise ValidationError(_("You can not make loops in clubs"))
        objs.append(cur)
        cur = cur.parent

is_owned_by(user)

Method to see if that object can be super edited by the given user.

Source code in club/models.py
def is_owned_by(self, user: User) -> bool:
    """Method to see if that object can be super edited by the given user."""
    if user.is_anonymous:
        return False
    return user.is_root or user.is_board_member

can_be_edited_by(user)

Method to see if that object can be edited by the given user.

Source code in club/models.py
def can_be_edited_by(self, user: User) -> bool:
    """Method to see if that object can be edited by the given user."""
    return self.has_rights_in_club(user)

can_be_viewed_by(user)

Method to see if that object can be seen by the given user.

Source code in club/models.py
def can_be_viewed_by(self, user: User) -> bool:
    """Method to see if that object can be seen by the given user."""
    return user.was_subscribed

get_membership_for(user)

Return the current membership the given user.

Note

The result is cached.

Source code in club/models.py
def get_membership_for(self, user: User) -> Membership | None:
    """Return the current membership the given user.

    Note:
        The result is cached.
    """
    if user.is_anonymous:
        return None
    membership = cache.get(f"membership_{self.id}_{user.id}")
    if membership == "not_member":
        return None
    if membership is None:
        membership = self.members.filter(user=user, end_date=None).first()
        if membership is None:
            cache.set(f"membership_{self.id}_{user.id}", "not_member")
        else:
            cache.set(f"membership_{self.id}_{user.id}", membership)
    return membership

Sith

Bases: Model

A one instance class storing all the modifiable infos.

NewsQuerySet

Bases: QuerySet

viewable_by(user)

Filter news that the given user can view.

If the user has the com.view_unmoderated_news permission, all news are viewable. Else the viewable news are those that are either moderated or authored by the user.

Source code in com/models.py
def viewable_by(self, user: User) -> Self:
    """Filter news that the given user can view.

    If the user has the `com.view_unmoderated_news` permission,
    all news are viewable.
    Else the viewable news are those that are either moderated
    or authored by the user.
    """
    if user.has_perm("com.view_unmoderated_news"):
        return self
    q_filter = Q(is_moderated=True)
    if user.is_authenticated:
        q_filter |= Q(author_id=user.id)
    return self.filter(q_filter)

News

Bases: Model

News about club events.

NewsDate

Bases: Model

A date associated with news.

A [News][] can have multiple dates, for example if it is a recurring event.

Weekmail

Bases: Model

The weekmail class.

:ivar title: Title of the weekmail :ivar intro: Introduction of the weekmail :ivar joke: Joke of the week :ivar protip: Tip of the week :ivar conclusion: Conclusion of the weekmail :ivar sent: Track if the weekmail has been sent

send()

Send the weekmail to all users with the receive weekmail option opt-in.

Also send the weekmail to the mailing list in settings.SITH_COM_EMAIL.

Source code in com/models.py
def send(self):
    """Send the weekmail to all users with the receive weekmail option opt-in.

    Also send the weekmail to the mailing list in settings.SITH_COM_EMAIL.
    """
    dest = [
        i[0]
        for i in Preferences.objects.filter(receive_weekmail=True).values_list(
            "user__email"
        )
    ]
    with transaction.atomic():
        email = EmailMultiAlternatives(
            subject=self.title,
            body=self.render_text(),
            from_email=settings.SITH_COM_EMAIL,
            to=Sith.objects.first().weekmail_destinations.split(" "),
            bcc=dest,
        )
        email.attach_alternative(self.render_html(), "text/html")
        email.send()
        self.sent = True
        self.save()
        Weekmail().save()

render_text()

Renders a pure text version of the mail for readers without HTML support.

Source code in com/models.py
def render_text(self):
    """Renders a pure text version of the mail for readers without HTML support."""
    return render(
        None, "com/weekmail_renderer_text.jinja", context={"weekmail": self}
    ).content.decode("utf-8")

render_html()

Renders an HTML version of the mail with images and fancy CSS.

Source code in com/models.py
def render_html(self):
    """Renders an HTML version of the mail with images and fancy CSS."""
    return render(
        None, "com/weekmail_renderer_html.jinja", context={"weekmail": self}
    ).content.decode("utf-8")

get_banner()

Return an absolute link to the banner.

Source code in com/models.py
def get_banner(self):
    """Return an absolute link to the banner."""
    return (
        "http://" + settings.SITH_URL + static("com/img/weekmail_bannerV2P22.png")
    )

Return an absolute link to the footer.

Source code in com/models.py
def get_footer(self):
    """Return an absolute link to the footer."""
    return "http://" + settings.SITH_URL + static("com/img/weekmail_footerP22.png")

WeekmailArticle

Bases: Model

Screen

Bases: Model

Poster

Bases: Model

news_notification_callback(notif)

Source code in com/models.py
def news_notification_callback(notif):
    count = News.objects.filter(
        dates__start_date__gt=timezone.now(), is_moderated=False
    ).count()
    if count:
        notif.viewed = False
        notif.param = str(count)
        notif.date = timezone.now()
    else:
        notif.viewed = True