Skip to content

Instantly share code, notes, and snippets.

@kalda341
Created December 20, 2018 04:59
Show Gist options
  • Save kalda341/d301e4d08f970549c365f7c548fb889b to your computer and use it in GitHub Desktop.
Save kalda341/d301e4d08f970549c365f7c548fb889b to your computer and use it in GitHub Desktop.
def get_queryset(self):
tables = {
'membership_table': Membership._meta.db_table,
'question_table': Question._meta.db_table,
'slide_question_table': SlideQuestion._meta.db_table,
'test_question_table': TestQuestion._meta.db_table,
'meta_question_table': MetaQuestion._meta.db_table,
'answer_table': Answer._meta.db_table,
'vote_table': Vote._meta.db_table,
'slide_question_link_table': SlideQuestionLink._meta.db_table,
}
def num_question_type(question_type_table):
return '''
SELECT COUNT({question_table}.id)
FROM {question_table}
INNER JOIN {question_type_table} ON
{question_table}.id = {question_type_table}.question_ptr_id
WHERE {question_table}.asked_by_id = {membership_table}.user_id
AND {question_table}.course_id = {membership_table}.course_id
'''.format(**tables, question_type_table=question_type_table)
def num_answer_type(question_type_table):
return '''
SELECT COUNT({answer_table}.id)
FROM {answer_table}
INNER JOIN {question_table} ON
{question_table}.id = {answer_table}.question_id
INNER JOIN {question_type_table} ON
{question_table}.id = {question_type_table}.question_ptr_id
WHERE {answer_table}.answered_by_id = {membership_table}.user_id
AND {answer_table}.hidden_to_others = \'false\'
AND {question_table}.course_id = {membership_table}.course_id
'''.format(**tables, question_type_table=question_type_table)
def question_vote_score():
return '''
SELECT SUM(CASE
WHEN {vote_table}.type = '+1' THEN 1
WHEN {vote_table}.type = '-1' THEN -1
ELSE 0
END
)
FROM {vote_table}
INNER JOIN {question_table} ON
{question_table}.id = {vote_table}.question_id
WHERE {question_table}.asked_by_id = {membership_table}.user_id
AND {question_table}.course_id = {membership_table}.course_id
'''.format(**tables)
def answer_vote_score():
return '''
SELECT SUM(CASE
WHEN {vote_table}.type = '+1' THEN 1
WHEN {vote_table}.type = '-1' THEN -1
ELSE 0
END
)
FROM {vote_table}
INNER JOIN {answer_table} ON
{answer_table}.id = {vote_table}.answer_id
INNER JOIN {question_table} ON
{question_table}.id = {answer_table}.question_id
WHERE {answer_table}.answered_by_id = {membership_table}.user_id
AND {question_table}.course_id = {membership_table}.course_id
'''.format(**tables)
def num_helpful_slides():
return '''
SELECT COUNT({slide_question_link_table}.id)
FROM {slide_question_link_table}
INNER JOIN {question_table} ON
{question_table}.id = {slide_question_link_table}.question_id
WHERE {slide_question_link_table}.value=1
AND {slide_question_link_table}.created_by_id = {membership_table}.user_id
AND {question_table}.course_id = {membership_table}.course_id
'''.format(**tables)
return super().get_queryset().extra({
'num_slide_questions': num_question_type(tables['slide_question_table']),
'num_test_questions': num_question_type(tables['test_question_table']),
'num_meta_questions': num_question_type(tables['meta_question_table']),
'question_vote_score': question_vote_score(),
'num_slide_question_answers': num_answer_type(tables['slide_question_table']),
'num_test_question_answers': num_answer_type(tables['test_question_table']),
'num_meta_question_answers': num_answer_type(tables['meta_question_table']),
'answer_vote_score': answer_vote_score(),
'num_helpful_slides': num_helpful_slides()
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment