from django import template
from django.template import Node, TemplateSyntaxError, Variable
from django.template.loader import render_to_string
from oioioi.base.utils import get_user_display_name
from oioioi.contests.utils import can_see_personal_data, is_contest_basicadmin
[docs]register = template.Library()
[docs]class UserInfoLinkNode(Node):
def __init__(self, target_user, asvar):
self.target_user = Variable(target_user)
self.asvar = asvar
[docs] def _get_user_name(self, context, user):
raise NotImplementedError
[docs] def render(self, context):
is_admin = context.get('is_admin', False) or is_contest_basicadmin(
context['request']
)
personal_data = can_see_personal_data(context['request'])
url = render_to_string(
'contests/user_info_link.html',
{
'ctx': context,
'target_user': self.target_user.resolve(context),
'target_name': self._get_user_name(
context, self.target_user.resolve(context)
),
'is_admin': is_admin,
'can_see_personal_data': personal_data,
},
)
if self.asvar:
context[self.asvar] = url
return ''
else:
return url
[docs]class PublicNameUserInfoLinkNode(UserInfoLinkNode):
[docs] def _get_user_name(self, context, user):
return context['request'].contest.controller.get_user_public_name(
context['request'], user
)
[docs]class FullNameUserInfoLinkNode(UserInfoLinkNode):
[docs] def _get_user_name(self, context, user):
return get_user_display_name(user)
[docs]def _get_name(parser, token, tag_name):
bits = token.split_contents()
if (len(bits) != 4 or bits[2] != 'as') and (len(bits) != 2):
raise TemplateSyntaxError(
"The tag should look like this: "
"{%% %s <user_object>[ as <variable>] %%}" % tag_name
)
asvar = None
if len(bits) == 4:
asvar = bits[3]
return (bits[1], asvar)
@register.tag
[docs]def public_name(parser, token):
(user, asvar) = _get_name(parser, token, "public_name")
return PublicNameUserInfoLinkNode(user, asvar)
@register.tag
[docs]def full_name(parser, token):
(user, asvar) = _get_name(parser, token, "full_name")
return FullNameUserInfoLinkNode(user, asvar)