diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css index 340e1abe..e64e764f 100644 --- a/src/static_src/css/bornhack.css +++ b/src/static_src/css/bornhack.css @@ -317,4 +317,16 @@ body.bar-menu { width: 300px; } - +.team-guide-markdown +{ + background-color: #f9f9f9; + padding: 10px 20px; +} +.team-guide-markdown h1, +.team-guide-markdown h2, +.team-guide-markdown h3, +.team-guide-markdown h4, +{ + font-size: 80%; + font-weight: bold; +} \ No newline at end of file diff --git a/src/teams/admin.py b/src/teams/admin.py index 59646a99..9fb3b571 100644 --- a/src/teams/admin.py +++ b/src/teams/admin.py @@ -14,6 +14,10 @@ class TeamTaskAdmin(admin.ModelAdmin): ] +class TeamMemberInline(admin.TabularInline): + model = TeamMember + + @admin.register(Team) class TeamAdmin(admin.ModelAdmin): def get_responsible(self, obj): @@ -41,6 +45,7 @@ class TeamAdmin(admin.ModelAdmin): 'private_irc_channel_bot', 'private_irc_channel_managed', ] + inlines = [TeamMemberInline] @admin.register(TeamMember) diff --git a/src/teams/migrations/0050_team_guide.py b/src/teams/migrations/0050_team_guide.py new file mode 100644 index 00000000..59375bd5 --- /dev/null +++ b/src/teams/migrations/0050_team_guide.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2019-03-12 10:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teams', '0049_auto_20180815_1119'), + ] + + operations = [ + migrations.AddField( + model_name='team', + name='guide', + field=models.TextField(blank=True, default='\n# Preparations\n\n...\n\n# Camp setup\n\n...\n\n# During camp\n\n...\n\n# Takedown\n\n...\n\n# Notes for next year\n\n 1. Remember to take notes\n 1. ...\n', help_text='HowTo guide for this year (and next year)', verbose_name='team guide (Markdown)'), + ), + ] diff --git a/src/teams/models.py b/src/teams/models.py index 77458fe9..cd68054d 100644 --- a/src/teams/models.py +++ b/src/teams/models.py @@ -14,6 +14,30 @@ from utils.models import CampRelatedModel, CreatedUpdatedModel, UUIDModel logger = logging.getLogger("bornhack.%s" % __name__) +TEAM_GUIDE_TEMPLATE=""" +## Preparations + +... + +## Camp setup + +... + +## During camp + +... + +## Takedown + +... + +## Notes for next year + + 1. Remember to take notes + 1. ... +""" + + class Team(CampRelatedModel): camp = models.ForeignKey( 'camps.Camp', @@ -114,6 +138,13 @@ class Team(CampRelatedModel): ordering = ['name'] unique_together = (('name', 'camp'), ('slug', 'camp')) + guide = models.TextField( + blank=True, + help_text="HowTo guide for this year (and next year)", + verbose_name="team guide (Markdown)", + default=TEAM_GUIDE_TEMPLATE, + ) + def __str__(self): return '{} ({})'.format(self.name, self.camp) diff --git a/src/teams/templates/team_base.html b/src/teams/templates/team_base.html index 2b1e84db..bcd861e8 100644 --- a/src/teams/templates/team_base.html +++ b/src/teams/templates/team_base.html @@ -53,6 +53,12 @@ Team: {{ team.name }} | {{ block.super }} {% endif %} +
  • + + Team guide + +
  • +
    diff --git a/src/teams/templates/team_guide.html b/src/teams/templates/team_guide.html new file mode 100644 index 00000000..e4a5732d --- /dev/null +++ b/src/teams/templates/team_guide.html @@ -0,0 +1,39 @@ +{% extends 'team_base.html' %} +{% load commonmark %} + +{% block title %} +Guide for: {{ team.name }} | {{ block.super }} +{% endblock %} + +{% block team_content %} + +
    +
    +
    + + Print + + {% if request.user in team.responsible_members.all %} + Edit + {% endif %} +
    +

    + Guide / Howto for {{ team.name }} +

    +
    +
    +

    +

    + +
    + {{ team.guide|untrustedcommonmark }} +
    +
    +
    + + + +{% endblock %} + diff --git a/src/teams/templates/team_guide_print.html b/src/teams/templates/team_guide_print.html new file mode 100644 index 00000000..8d681d65 --- /dev/null +++ b/src/teams/templates/team_guide_print.html @@ -0,0 +1,11 @@ +{% load commonmark %} + + +{{ team.name }} + + + +{{ team.guide|untrustedcommonmark }} + + + diff --git a/src/teams/templatetags/teams_tags.py b/src/teams/templatetags/teams_tags.py index 47c5d262..78ba078b 100644 --- a/src/teams/templatetags/teams_tags.py +++ b/src/teams/templatetags/teams_tags.py @@ -1,7 +1,16 @@ from django import template +from teams.models import TeamMember from django.utils.safestring import mark_safe register = template.Library() + +@register.filter +def is_team_member(user, team): + return TeamMember.objects.filter( + team=team, user=user, approved=True + ).exists() + + @register.simple_tag def membershipstatus(user, team, showicon=False): if user in team.responsible_members.all(): @@ -21,4 +30,3 @@ def membershipstatus(user, team, showicon=False): return mark_safe("" % (icon, text)) else: return text - diff --git a/src/teams/urls.py b/src/teams/urls.py index 9e84f0f0..55d13a36 100644 --- a/src/teams/urls.py +++ b/src/teams/urls.py @@ -40,6 +40,11 @@ from teams.views.shifts import ( UserShifts, ) +from teams.views.guide import ( + TeamGuideView, + TeamGuidePrintView +) + app_name = 'teams' urlpatterns = [ @@ -75,6 +80,16 @@ urlpatterns = [ TeamManageView.as_view(), name='manage' ), + path( + 'guide/', + TeamGuideView.as_view(), + name='guide' + ), + path( + 'guide/print/', + TeamGuidePrintView.as_view(), + name='guide_print' + ), path( 'fix_irc_acl/', FixIrcAclView.as_view(), diff --git a/src/teams/views/base.py b/src/teams/views/base.py index ee5c7c77..cf52084b 100644 --- a/src/teams/views/base.py +++ b/src/teams/views/base.py @@ -46,7 +46,7 @@ class TeamManageView(CampViewMixin, EnsureTeamResponsibleMixin, UpdateView): fields = ['description', 'needs_members', 'public_irc_channel_name', 'public_irc_channel_bot', 'public_irc_channel_managed', 'private_irc_channel_name', 'private_irc_channel_bot', - 'private_irc_channel_managed'] + 'private_irc_channel_managed', 'guide'] slug_url_kwarg = 'team_slug' def get_success_url(self): diff --git a/src/teams/views/guide.py b/src/teams/views/guide.py new file mode 100644 index 00000000..07fdc916 --- /dev/null +++ b/src/teams/views/guide.py @@ -0,0 +1,28 @@ +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import ListView, DetailView + +from camps.mixins import CampViewMixin + +from ..models import Team + + +class TeamGuideView(LoginRequiredMixin, CampViewMixin, DetailView): + template_name = "team_guide.html" + context_object_name = 'team' + model = Team + slug_url_kwarg = 'team_slug' + active_menu = 'guide' + + def get_queryset(self): + qs = CampViewMixin.get_queryset(self) + qs.filter( + teammember__approved=True, + teammember__user=self.request.user, + ) + return qs + + +class TeamGuidePrintView(TeamGuideView): + template_name = "team_guide_print.html" + +