from django.utils.safestring import mark_safe import django_tables2 as tables from django_tables2.utils import A from .models import Question, UserAnswer from django.utils.html import format_html from generic.tables import SelectionTable class QuestionTable(SelectionTable): def get_view_cell(record): if record.open_access: return mark_safe( """ View""" ) else: return 'View' #edit = tables.LinkColumn( # "sbas:sbas_question_update", text="Edit", args=[A("pk")], orderable=False #) view = tables.LinkColumn( "sbas:question_detail", text=get_view_cell, args=[A("pk")], orderable=False ) #delete = tables.LinkColumn( # "sbas:question_delete", text="Delete", args=[A("pk")], orderable=False #) #exams = tables.ManyToManyColumn(verbose_name="Exams") #selection = tables.CheckBoxColumn(accessor="pk", orderable=False) stem = tables.Column() answers = tables.TemplateColumn("
  1. {{ record.a_answer|safe}}
  2. {{ record.b_answer|safe}}
  3. {{ record.c_answer|safe}}
  4. {{ record.d_answer|safe}}
  5. {{ record.e_answer|safe}}
") edit = tables.LinkColumn( "sbas:question_update", text="Edit", args=[A("pk")], orderable=False ) class Meta(SelectionTable.Meta): model = Question template_name = "django_tables2/bootstrap4.html" fields = ( #"stem", #"a_answer", #"b_answer", #"c_answer", #"d_answer", #"e_answer", "best_answer", "created_date", "category", "author", "edit" ) sequence = ("view", "stem", "answers")#, "exams") #`attrs = {"class": "table"} order_by = "-created_date" def __init__(self, data=None, *args, **kwargs): super().__init__( data.prefetch_related( "category", "author" ), *args, **kwargs, ) def render_stem(self, value, record=None, **kwargs): """Render the stem, optionally with a title from the record. Some versions of django-tables2 may call the render method without passing a `record`; guard for that and fall back to rendering the value only. """ title = getattr(record, "title", None) if record is not None else None if title: return format_html("
{}
{}", title, mark_safe(value)) return mark_safe(value) def render_best_answer(self, value, record=None, **kwargs): """Show only the capitalised first character of the best_answer.""" if value is None: return "" s = str(value).strip() if not s: return "" return s[0].upper() class UserAnswerTable(tables.Table): select = tables.CheckBoxColumn(accessor=("pk")) #delete = tables.LinkColumn( # "sbas:user_answer_delete", text="Delete", args=[A("pk")], orderable=False #) view = tables.LinkColumn('sbas:user_answer_view', text='View', args=[A('pk')], orderable=False) class Meta: model = UserAnswer template_name = "django_tables2/bootstrap4.html" fields = ( "cid", "user", "question", "answer", #"answer_compare", "exam", "created", "updated", )