Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Assessments app Initial model structure #2

Open
wants to merge 2 commits into
base: features/assessments-app
Choose a base branch
from

Conversation

goztrk
Copy link

@goztrk goztrk commented Sep 12, 2023

No description provided.

DEFAULT_RELATED_NAME = 'questions'


class Question(HtkBaseModel):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm thinking that there should be:

Question Types:

  • BasicQuestion - answer is a free text response (e.g. What is 1+1?: 2)
  • MultiChoiceQuestion - multiple answer choices are presented, only one is correct
  • MultiChoiceMultiAnswerQuestion - multiple answer choices are presented, any number (0 or many) can be correct, all correct responses must be selected

DEFAULT_RELATED_NAME = 'choices'


class QuestionChoice(HtkBaseModel):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • AnswerChoice

DEFAULT_RELATED_NAME = 'answers'


class Answer(HtkBaseModel):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

class Assessment:
    @property
    def max_score(self):
        return self.questions.count()


class AssessmentQuestion:
    assessment: fk(Assesssment)


class AssessmentResponse
     assessment: fk
     user: fk

    @property
    def score(self):
        score = len([response for response in self.responses.all() if response.is_correct])
        return score

    @property
    def display_score(self):
        return f'{self.score} / {self.assessment.max_score}'

    @property
    def score_percentage(self):
        return self.score / self.assessment.max_score * 100


class AssessmentQuestionCorrectResponse:  # or `AnswerKey`?
     assessment: fk
     question(_id): fk, related_name="answer_key", unique=True  # (or maybe OneToOneField?)
     answer_text: str(correct answer)
     answer_choices: M2M(AnswerChoice)


class AssessmentQuestionResponse:
    assessment_response: fk(AssessmentResponse, related_name="responses")
    question: fk(the question this response is for)
    answer_text: str(user's text)
    answer_choices: M2M(AnswerChoice)

    def __init__(self, assessment_response):
        pass

    @property
    def is_correct(self):
         is_correct = True  # innocent until proven guilty

         answer_key = self.question.answer_key
         
         if is_correct and answer_key.answer_text != self.answer_text:
            is_correct = False

         if is_correct and answer_key.answer_choices != self.answer_choices:
            is_correct = False

        return is_correct

# Properties

@property
def choices_ordered(self):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

answer_choices_**

text = models.TextField(max_length=512)
order = models.PositiveSmallIntegerField(default=0)
should_shuffle_choices = models.BooleanField(default=False)
has_correct_answer = models.BooleanField(default=False)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants