devilry_group
— Devilry group models and views
The devilry_group
module handles the delivery of assignments by students.
About the devilry group app
The devilry_group app uses a comment/event-based feedbackfeed system for delivering assignments and recieiving feedback on those deliveries.
The feedbackfeed gather all information about a an assignment in one place, and makes it easy for students, examiners and admins to communicate.
The feedbackfeed consists of one or more feedbacksets.
A feedbackset may or may not have a deadline and zero or more comments belonging to it.
Students, examiners and admins can write comments to the feedbackset.
If a student fails an assignment, and is given another chance, a new feedbackset is created with a new deadline.
All events show up in the feed in the order they happen, when a deadline is created, a comment is posted, a deadline ends and the status of the grading. You also have direct access to download the files delivered from the feedbackfeed.
What is a FeedbackSet?
The FeedbackSet has a foreignkey to an AssignmentGroup and groups all information about a specific deadline for the Assignment the AssignmentGroup is associated with. A new FeedbackSet is created for each deadline e.g. regarding new attempts if the student failed on the first delivery. See the model API below.
Datamodel API
- exception devilry.devilry_group.models.HardDeadlineExpiredException(message, *args, **kwargs)
Should be raised regarding GroupComments if the deadline handling is hard, and the deadline has expired.
- exception devilry.devilry_group.models.PeriodExpiredException(message, *args, **kwargs)
Should be raised regarding GroupComments if the period(semester) has expired.
- class devilry.devilry_group.models.AbstractGroupCommentQuerySet(model=None, query=None, using=None, hints=None)
Base class for QuerySets for
AbstractGroupComment
.- exclude_private_comments_from_other_users(user)
Exclude all
GroupComments
withGroupComment.visibility
set toGroupComment.VISIBILITY_PRIVATE
and theGroupComment.user
is not theuser
.- Parameters:
user – The requestuser.
- Returns:
QuerySet of
GroupComment
not excluded.- Return type:
QuerySet
- exclude_is_part_of_grading_feedbackset_unpublished()
Exclude all
GroupComment
that hasGroupComment.part_of_grading
set toTrue
if theGroupComment.feedback_set.grading_published_datetime
isNone
.- Returns:
QuerySet of
GroupComment
not excluded.- Return type:
QuerySet
- exclude_comment_is_not_draft_from_user(user)
Exclude
GroupComment
that are not drafts or theGroupComment.user
is not the requestuser.A
GroupComment
is a draft ifGroupComment.visibility
set toGroupComment.VISIBILITY_PRIVATE
andGroupComment.part_of_grading
isTrue
.- Parameters:
user – The requestuser
- Returns:
QuerySet of
GroupComment
not excluded.- Return type:
QuerySet
- class devilry.devilry_group.models.AbstractGroupComment(*args, **kwargs)
The abstract superclass of all comments related to a delivery and feedback.
- feedback_set
The related feedbackset. See
FeedbackSet
.
- part_of_grading
If this is
True
, the comment is published when the feedbackset is published. This means that this comment is part of the feedback/grading from the examiner. The samevisibility
rules apply no matter if this isTrue
orFalse
, this only controls when the comment is published.
- VISIBILITY_PRIVATE = 'private'
Choice for
visibility
.
- VISIBILITY_VISIBLE_TO_EXAMINER_AND_ADMINS = 'visible-to-examiner-and-admins'
Comment should only be visible to examiners and admins that has access to the
feedback_set
. Choice forvisibility
.
- VISIBILITY_VISIBLE_TO_EVERYONE = 'visible-to-everyone'
Comment should be visible to everyone that has access to the
feedback_set
. Choice forvisibility
.
- VISIBILITY_CHOICES = [('private', 'Private'), ('visible-to-examiner-and-admins', 'Visible to examiners and admins'), ('visible-to-everyone', 'Visible to everyone')]
Choice list. Choices for
visibility
.
- visibility
Sets the visibility choise of the comment. Defaults to
VISIBILITY_VISIBLE_TO_EVERYONE
.
- clean()
Check for situations that should result in error.
- Raises:
ValidationError: Error occurs if
user_role
is'student'
andvisibility
is not set toVISIBILITY_VISIBLE_TO_EVERYONE
| Error occurs ifuser_role
is'examiner'
andpart_of_grading
isFalse
andvisibility
is set toVISIBILITY_PRIVATE
.
- get_published_datetime()
Get the publishing datetime of the comment. Publishing datetime is the publishing time of the FeedbackSet if the comment has
part_of_grading
set to True, else it’s just the comments’ published_datetime.- Returns:
Datetime.
- publish_draft(time)
Sets the published datetime of the comment to
time
.- Parameters:
time – publishing time to set for the comment.
- copy_comment_into_feedbackset(feedbackset)
Creates a new GroupComment, copies all fields in self into the new comment and sets feedback_set foreign key to
feedbackset
:param feedbackset:FeedbackSet
- Returns:
GroupComment
a new group comment
- class devilry.devilry_group.models.FeedbackSetQuerySet(model=None, query=None, using=None, hints=None)
QuerySet for
FeedbackSet
.- get_order_by_deadline_datetime_argument()
Get a Coalesce expression that can be used with
order_by()
to order feedbacksets by deadline. This handles ordering the first feedbackset by the first deadline of the assignment.Examples
Basics (same as using
order_by_deadline_datetime()
):FeedbackSet.objects.all() .order_by(FeedbackSet.objects.get_order_by_deadline_datetime_argument())
Combine with other order by arguments:
FeedbackSet.objects.all() .order_by('group__parentnode__short_name', 'group__id', FeedbackSet.objects.get_order_by_deadline_datetime_argument())
- order_by_deadline_datetime()
Order by
deadline_datetime
.Unlike just using
order_by('deadline_datetime')
, this method usesget_order_by_deadline_datetime_argument()
, which ensures that the first feedbackset is ordered using the first deadline of the assignment.
- has_public_comment_files_from_students(feedback_set)
Does the
devilry.devilry_group.models.FeedbackSet
have any publicdevilry.devilry_comment.models.CommentFile
from students?- Parameters:
feedback_set – The FeedbackSet to check.
- Returns:
True
if any public student files, elseFalse
.
- filter_public_comment_files_from_students()
Get all devilry.devilry_group.models.FeedbackSet with public comments from students.
- Returns:
A FeedbackSet queryset.
- Return type:
QuerySet
- class devilry.devilry_group.models.FeedbackSet(*args, **kwargs)
All comments that are given for a specific deadline (delivery and feedback) are linked to a feedback-set.
If the comment has instant_publish=True it will be published instantly, otherwise the comments will only be visible once the feedbackset is published. All student-comments will be instant_publish=True, and the same applies to comments made by examiners that are not a part of feedback.
- group
The AssignmentGroup that owns this feedbackset.
- FEEDBACKSET_TYPE_FIRST_ATTEMPT = 'first_attempt'
This means the feedbackset is basically the first feedbackset. Choice for
feedbackset_type
.
- FEEDBACKSET_TYPE_NEW_ATTEMPT = 'new_attempt'
Is not the first feedbackset, but a new attempt. Choice for
feedbackset_type
- FEEDBACKSET_TYPE_RE_EDIT = 're_edit'
Something went wrong on grading, with this option, a new deadline should not be given to student. Student should just get notified that a new feedback was given. Choice for
feedbackset_type
.
- FEEDBACKSET_TYPE_MERGE_FIRST_ATTEMPT = 'merge_first_attempt'
A merged first attempt feedbackset
- FEEDBACKSET_TYPE_MERGE_NEW_ATTEMPT = 'merge_new_attempt'
A merged new attempt feedbackset
- FEEDBACKSET_TYPE_MERGE_RE_EDIT = 'merge_re_edit'
A merged re edit feedbackset
- FEEDBACKSET_TYPE_CHOICES = [('first_attempt', 'first attempt'), ('new_attempt', 'new attempt'), ('re_edit', 're edit'), ('merge_first_attempt', 'merge first attempt'), ('merge_new_attempt', 'merge new attempt'), ('merge_re_edit', 'merge re edit')]
Grading status choices for
feedbackset_type
.
- feedbackset_type
Sets the type of the feedbackset. Defaults to
FEEDBACKSET_TYPE_NEW_ATTEMPT
.
- ignored
Field can be set to
True
if a situation requires theFeedbackSet
to not be counted as neither passed or failed but should be ignored, due to e.g sickness or something else. A reason for theFeedbackSet
to be ignored must be provided in theignored_reason
.
- ignored_reason
The reason for the
FeedbackSet
to be ignored.
- ignored_datetime
The datetime for when the
FeedbackSet
was ignored.
- created_by
The User that created the feedbackset. Only used as metadata for superusers (for debugging).
- created_datetime
The datetime when this FeedbackSet was created.
- last_updated_by
Last updated by. The user that was the last to make any changes on the
FeedbackSet
.
- deadline_datetime
The datetime of the deadline. The first feedbackset in an AssignmentGroup (ordered by
created_datetime
) does not have a deadline. It inherits this from thefirst_deadline
field ofdevilry.apps.core.models.assignment.Assignment
.
- grading_published_datetime
The datetime when the feedback was published. Set when an examiner publishes the feedback for this FeedbackSet.
When this is
None
, the feedbackset is not published. This means that no comments withAbstractGroupComment.part_of_grading
set toTrue
is visible, the grade (extracted from points) is not visible, and this feedbackset does not count when extracting the latest/active feedback/grade for the AssignmentGroup.
- grading_published_by
Set when the feedbackset is published by an examiner. If this is
None
, the feedback is not published, and thepoints
(grade) is not available to the student.
- grading_points
Points given by examiner for this feedbackset. The points on the last published FeedbackSet is the current grade for the AssignmentGroup.
- gradeform_data_json
A
django.db.models.TextField
for a gradeform filled or not filled for FeedbackSet.
- clean()
Check for situations that should result in error.
- Raises:
ValidationError: Error occurs if
ignored
isTrue
andignored_reason
is blank. | Error occurs ifignored_reason
is filled andignored
isTrue
. | Error occurs ifgrading_published_datetime
has a datetime butgrading_published_by
isNone
. | Error occurs ifgrading_published_datetime
has a datetime butgrading_points
isNone
.
- can_add_comment(comment_user_role, assignment=None)
Check if comments and uploads should be disabled for this feedback set for the role of the comment.
This method raises a custom exception based on what why comments and uploads are not allowed:
Raises
HardDeadlineExpiredException
if the assignment for this feedback set has deadline handling set to hard, students can not upload or add comments.Raises
PeriodExpiredException
if the period has expired, no one can upload or add comments.A message will be provided with the exceptions.
- Parameters:
comment_user_role – One of the choices for
user_role
.Comment.USER_ROLE_STUDENT
,Comment.USER_ROLE_EXAMINER
orComment.USER_ROLE_ADMIN
.assignment – The assignment for this feedback set.
- publish(published_by, grading_points, gradeform_data_json='')
Publishes this FeedbackSet and comments that belongs to this it and that are part of the grading.
- Parameters:
published_by – Who published the feedbackset.
grading_points – Points to give to student(s).
gradeform_data_json – gradeform(coming soon).
- Returns:
True or False and an error message.
- copy_feedbackset_into_group(group, target=None)
Copy this feedbackset into
target
or create a new feedbackset, and set group foreign key togroup
- Parameters:
group –
AssignmentGroup
target –
FeedbackSet
- Returns:
FeedbackSet
a feedbackset with copied data from self
- exception DoesNotExist
- exception MultipleObjectsReturned
- class devilry.devilry_group.models.FeedbacksetPassedPreviousPeriod(*args, **kwargs)
This model is used when a student have passed an assignment in previous period. Therefore we need to save some old data about the
core.Assignment
,devilry_group.FeedbackSet
andcore.Period
from previous period.- feedbackset
devilry_group.FeedbackSet in current period.
- Type:
Foreign key to class
- passed_previous_period_type
The type of this entry. How it was generated.
- assignment_short_name
Old
core.Assignment.short_name
.
- assignment_long_name
Old
core.Assignment.long_name
.
- created_datetime
When this entry was created.
- created_by
Who this entry was created by.
- exception DoesNotExist
- exception MultipleObjectsReturned
- class devilry.devilry_group.models.FeedbackSetGradingUpdateHistory(*args, **kwargs)
Logs changes on the grading for a feedbackset.
If we have this history, there will be no problem changing the grades on an already corrected feedback set, as we can display the history, just as with FeedbackSetDeadlineHistory.
- feedback_set
The
FeedbackSet
the update is for.
- updated_by
The user that updated the feedback set.
- updated_datetime
When the update was made.
- old_grading_points
The score before update
- old_grading_published_by
Who published the feedbackset before the update.
- old_grading_published_datetime
Grading publishing datetime before update
- exception DoesNotExist
- exception MultipleObjectsReturned
- class devilry.devilry_group.models.FeedbackSetDeadlineHistory(*args, **kwargs)
Logs change in deadline for a FeedbackSet.
- feedback_set
The
FeedbackSet
the change is for.
- changed_by
The User that made the deadline change.
- changed_datetime
Time of change. Defaults to
timezone.now
.
- deadline_old
The old
deadline_datetime
.
- deadline_new
The new
deadline_datetime
.
- exception DoesNotExist
- exception MultipleObjectsReturned
- class devilry.devilry_group.models.GroupCommentQuerySet(model=None, query=None, using=None, hints=None)
QuerySet for
GroupComment
.
- class devilry.devilry_group.models.GroupComment(*args, **kwargs)
A comment made to an AssignmentGroup.
- v2_id
v2 “<modelname>_<id>” This is only here to make it possible to debug and fix v2 migrations if anything goes wrong.
- clean()
Check for situations that should result in error.
- Raises:
ValidationError: Error occurs if
user_role
is'student'
andvisibility
is not set toVISIBILITY_VISIBLE_TO_EVERYONE
| Error occurs ifuser_role
is'examiner'
andpart_of_grading
isFalse
andvisibility
is set toVISIBILITY_PRIVATE
.
- exception DoesNotExist
- exception MultipleObjectsReturned
- feedback_set
The related feedbackset. See
FeedbackSet
.
- part_of_grading
If this is
True
, the comment is published when the feedbackset is published. This means that this comment is part of the feedback/grading from the examiner. The samevisibility
rules apply no matter if this isTrue
orFalse
, this only controls when the comment is published.
- visibility
Sets the visibility choise of the comment. Defaults to
VISIBILITY_VISIBLE_TO_EVERYONE
.
- class devilry.devilry_group.models.GroupCommentEditHistoryQuerySet(model=None, query=None, using=None, hints=None)
- exclude_private_comment_not_created_by_user(user)
Exclude all
GroupCommentEditHistory
entries that are private and where the comment is not created by the user.- Parameters:
user – The user to check against.
- class devilry.devilry_group.models.GroupCommentEditHistory(*args, **kwargs)
Model for logging changes in a
GroupComment
.- group_comment
The
GroupComment
the editing history is for.
- visibility
Visibility state when log entry was created.
- exception DoesNotExist
- exception MultipleObjectsReturned
- class devilry.devilry_group.models.ImageAnnotationCommentQuerySet(model=None, query=None, using=None, hints=None)
QuerySet for
ImageAnnotationComment
.
- class devilry.devilry_group.models.ImageAnnotationComment(*args, **kwargs)
A comment made on a file, as an annotation
- exception DoesNotExist
- exception MultipleObjectsReturned
- feedback_set
The related feedbackset. See
FeedbackSet
.
- part_of_grading
If this is
True
, the comment is published when the feedbackset is published. This means that this comment is part of the feedback/grading from the examiner. The samevisibility
rules apply no matter if this isTrue
orFalse
, this only controls when the comment is published.
- visibility
Sets the visibility choise of the comment. Defaults to
VISIBILITY_VISIBLE_TO_EVERYONE
.
Views API
- class devilry.devilry_group.views.cradmin_feedbackfeed_base.GroupCommentForm(*args, **kwargs)
Abstract class for creating a
GroupComment
.Defines the attributes for the
GroupComment
form.Examples
If you want to provide a check on the form data before save, just subclass this and add your custom clean logic:
class StandardGroupCommentForm(GroupCommentForm): def clean(self): super(GroupCommentForm, self).clean() if len(self.cleaned_data['text']) == 0 and self.cleaned_data['temporary_file_collection_id'] is None: raise ValidationError({ 'text': gettext_lazy('A comment must have either text or a file attached, or both.' ' An empty comment is not allowed.') })
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.cradmin_feedbackfeed_base.StandardGroupCommentForm(*args, **kwargs)
This should be used by all views that requires the comment to either contain a file/files OR text.
Failing to provide file/files or text will result in an error message. This is handled in clean.
- clean()
Hook for doing any extra form-wide cleaning after Field.clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named ‘__all__’.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.cradmin_feedbackfeed_base.FeedbackFeedBaseView(**kwargs)
Base feedbackfeed view.
The feedbackfeed view handles the options a certain devilryrole(
student
,examiner
, ‘someadmin’) should have when the feedbackfeed view is rendered. Specialized views for each devilryrole must subclasses this class.Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- model
alias of
GroupComment
- form_attributes = {'cradmin-legacy-bulkfileupload-form': '', 'cradmin-legacy-bulkfileupload-form-prevent-window-dragdrop': 'true'}
Used to add custom attributes like angularjs directives to the form. See
get_form_attributes()
.
- post(request, *args, **kwargs)
Handle POST requests: instantiate a form instance with the passed POST variables and then check if it’s valid.
- get(request, *args, **kwargs)
Handle GET requests: instantiate a blank version of the form.
- get_devilryrole()
Get the devilryrole of a user. This function must be implemented by a subclass.
- Raises:
NotImplementedError – Raised if not implemented by subclass.
- get_form_class()
Return the form class to use in this view.
- get_form_kwargs()
Return the keyword arguments for instantiating the form.
- get_hard_deadline_info_text()
Get hard deadline info text. Must be implemented in subclasses.
Uses function
get_devilry_hard_deadline_info_text
.- Returns:
info text.
- Return type:
str
- get_context_data(**kwargs)
Sets the context data needed to render elements in the template.
- Parameters:
**kwargs (dict) – Parameters to get_context_data.
- Returns:
The context data dictionary.
- Return type:
dict
- get_available_commentfile_count_for_user()
Get the total amount of CommentFiles available for the student.
- Returns:
Count of CommentFiles available for the user.
- Return type:
(int)
- get_button_layout()
Get the button layout. This is added to the crispy form layout.
Defaults to a
crispy_forms.layout.Div
with css classcradmin_legacy_submitrow
containing all the buttons returned byget_buttons()
.- Returns:
List of buttons.
- Return type:
list
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- get_form_heading_text_template_name()
Get template for rendering a heading text in the form.
Override this to provide an explanatory text added to the heading of the form for posting a comment. This should include some information about what happens when a comment is posted.
- Returns:
a string or path to html template or None.
- Return type:
(str)
- get_field_layout()
Get a list/tuple of fields. These are added to a
crispy_forms.layout.Layout
. Defaults to a all fields on the model. Iffields
, we use those fields.Simple example (same as specifying the fields in
fields
):from crispy_forms import layout class MyCreateView(CreateView): def get_field_layout(self): return [ layout.Div( 'title', 'name', 'size', 'tags', css_class='cradmin-globalfields') ]
A slightly more complex example:
from crispy_forms import layout class MyCreateView(CreateView): def get_field_layout(self): return [ layout.Div('title', css_class="cradmin-focusfield cradmin-focusfield-lg"), layout.Div('description', css_class="cradmin-focusfield"), layout.Fieldset('Metadata', 'size', 'tags' ) ]
- get_form(form_class=None)
If you set
roleid_field
, we will remove that field from the form.Note
The
roleid_field
handling also works for GenericForeignKey fields (removes the content type and object pk field from the form).
- set_automatic_attributes(obj)
Called by
save_object()
to set automatic attributes for the object before it is saved.This is where we handle
roleid_field
, but you can override this to set your own automatic attributes. Just remember to callsuper
if you want to keep theroleid_field
magic.- Parameters:
obj – The object you are about to save.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- perform_after_save(comment)
This method is called if the comment posted is saved and commit is
True
. This means that both the comment and files uploaded with it is saved in the database.Override this function for operations that require that the comment is saved, such as email sending etc.
- get_collectionqueryset()
Get a set of files from cradmins
temporary fileuploadstore
.- Returns:
cradmin_legacy.TemporaryFileCollection
objects.- Return type:
QuerySet
- get_success_message(object)
Override this to provide a success message.
The
object
is the saved object.Used by
add_success_messages()
.
Examiner view
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.AbstractFeedbackForm(*args, **kwargs)
Feedback-related forms regarding grading or creating a new FeedbackSet inherits from this.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.PassedFailedFeedbackForm(*args, **kwargs)
Form for passed/failed grade plugin.
- passed
Set delivery as passed or failed.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.PointsFeedbackForm(*args, **kwargs)
Form for point-based grade plugin.
- points
Set points that should be given to the delivery.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.EditGroupCommentForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)
Form for editing existing Feedback drafts.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.CreateFeedbackSetForm(*args, **kwargs)
Form for creating a new FeedbackSet (deadline).
- deadline_datetime
Deadline to be added to the new FeedbackSet.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.ExaminerBaseFeedbackFeedView(**kwargs)
Base view for examiner.
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_hard_deadline_info_text()
Get hard deadline info text. Must be implemented in subclasses.
Uses function
get_devilry_hard_deadline_info_text
.- Returns:
info text.
- Return type:
str
- get_devilryrole()
Get the devilryrole for the view.
- Returns:
examiner
as devilryrole.- Return type:
str
- set_automatic_attributes(obj)
Called by
save_object()
to set automatic attributes for the object before it is saved.This is where we handle
roleid_field
, but you can override this to set your own automatic attributes. Just remember to callsuper
if you want to keep theroleid_field
magic.- Parameters:
obj – The object you are about to save.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.ExaminerFeedbackView(**kwargs)
The examiner feedbackview. This is the view where examiner corrects the delivery made by a student and is only able to create drafted comments, or publish grading.
If the last FeedbackSet is published, this view redirects to
ExaminerFeedbackCreateFeedbackSetView
. Seedispatch()
.Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- dispatch(request, *args, **kwargs)
Checks if the last FeedbackSet in the group is published. If it’s published, a redirect response to
ExaminerFeedbackCreateFeedbackSetView
is returned.- Parameters:
request – request object.
- Returns:
The HTTP response.
- Return type:
HttpResponse
- get_form_class()
Get the correct form based on what grade plugin that is used.
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- get_form_invalid_message(form)
You can override this to provide a custom error message.
Defaults to “Please fix the errors in the form below.”.
The
form
is the invalid form object.Used by
add_form_invalid_messages()
.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.ExaminerPublicDiscussView(**kwargs)
View for discussing with everyone on the group.
All comments posted here are visible to everyone that has access to the group.
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_form_heading_text_template_name()
Get template for rendering a heading text in the form.
Override this to provide an explanatory text added to the heading of the form for posting a comment. This should include some information about what happens when a comment is posted.
- Returns:
a string or path to html template or None.
- Return type:
(str)
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- perform_after_save(comment)
This method is called if the comment posted is saved and commit is
True
. This means that both the comment and files uploaded with it is saved in the database.Override this function for operations that require that the comment is saved, such as email sending etc.
- get_success_url()
Return the URL to redirect to after processing a valid form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.ExaminerWithAdminsDiscussView(**kwargs)
View for discussing with other examiners on the group and admins.
All comments posted here are only visible to examiners and admins with access to the group.
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_form_heading_text_template_name()
Get template for rendering a heading text in the form.
Override this to provide an explanatory text added to the heading of the form for posting a comment. This should include some information about what happens when a comment is posted.
- Returns:
a string or path to html template or None.
- Return type:
(str)
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- perform_after_save(comment)
This method is called if the comment posted is saved and commit is
True
. This means that both the comment and files uploaded with it is saved in the database.Override this function for operations that require that the comment is saved, such as email sending etc.
- get_success_url()
Return the URL to redirect to after processing a valid form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.EditGradeForm(*args, **kwargs)
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.EditGradePointsForm(*args, **kwargs)
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.EditGradePassedFailedForm(*args, **kwargs)
- clean()
Hook for doing any extra form-wide cleaning after Field.clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named ‘__all__’.
- property media
Return all media required to render the widgets on this form.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.ExaminerEditGradeView(**kwargs)
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- model
alias of
FeedbackSet
- get_pagetitle()
Get the page title (the title tag).
Defaults to
Edit <verbose_name model>
.
- get_queryset_for_role(role)
Get a queryset with all objects of
self.model
that the current role can access.
- get_form_class()
Return the form class to use in this view.
- set_automatic_attributes(obj)
Called by
save_object()
to set automatic attributes for the object before it is saved.This is where we handle
roleid_field
, but you can override this to set your own automatic attributes. Just remember to callsuper
if you want to keep theroleid_field
magic.- Parameters:
obj – The object you are about to save.
- save_object(form, commit=True)
Save the object. You can override this to customize how the form is turned into a saved object.
Make sure you call
super
if you override this (see the docs for the commit parameter). If you do not, you will loose the automatic handling of obj:.roleid_field.- Parameters:
commit (boolean) – If this is
False
, the object is returned unsaved. Very useful when you want to manipulate the object before saving it in a subclass.- Returns:
The saved object.
- get_field_layout()
Get a list/tuple of fields. These are added to a
crispy_forms.layout.Layout
. Defaults to a all fields on the model. Iffields
, we use those fields.Simple example (same as specifying the fields in
fields
):from crispy_forms import layout class MyCreateView(CreateView): def get_field_layout(self): return [ layout.Div( 'title', 'name', 'size', 'tags', css_class='cradmin-globalfields') ]
A slightly more complex example:
from crispy_forms import layout class MyCreateView(CreateView): def get_field_layout(self): return [ layout.Div('title', css_class="cradmin-focusfield cradmin-focusfield-lg"), layout.Div('description', css_class="cradmin-focusfield"), layout.Fieldset('Metadata', 'size', 'tags' ) ]
- get_context_data(**kwargs)
Get the context data required to render the form view.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.GroupCommentEditDeleteMixin
Basic mixin/super-class for GroupCommentDeleteView and GroupCommentEditView.
- model
alias of
GroupComment
- get_queryset_for_role(role)
Filter out
devilry.devilry_group.models.GroupComment
based on the role of role of the crinstance and the primarykey of the comment since in this case only a single comment should be fetched.- Parameters:
role (GroupComment) – The roleclass for the crinstance.
- Returns:
QuerySet containing a single
devilry.devilry_group.models.GroupComment
.- Return type:
QuerySet
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.GroupCommentDeleteView(*args, **kwargs)
View for deleting an existing groupcomment with visibility set to private. When a groupcomment has visibility set to private, this means it’s a feedbackdraft.
- template_name = 'devilry_group/feedbackfeed_examiner/feedbackfeed_examiner_delete_groupcomment.html'
The name of the template to use.
- dispatch(request, *args, **kwargs)
Checks if the GroupComment id passed is for a drafted comment. If the comment is not a draft, PermissionDenied is raised.
- Parameters:
request (HttpRequest) – request object.
- Returns:
Reponse redirect object.
- Return type:
HttpResponseRedirect
- Raises:
PermissionDenied – If comment is not a draft, this exception is raised.
- get_object_preview()
The preview of the object. Used when asking the user if he/she wants to delete the current object.
- get_queryset_for_role(role)
Filter out
devilry.devilry_group.models.GroupComment
based on the role of role of the crinstance and the primarykey of the comment since in this case only a single comment should be fetched.- Parameters:
role (GroupComment) – The roleclass for the crinstance.
- Returns:
QuerySet containing a single
devilry.devilry_group.models.GroupComment
.- Return type:
QuerySet
- get_success_url()
Get the URL to go to if object was deleted.
Defaults to the INDEX view of the current app.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.GroupCommentEditView(**kwargs)
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.ExaminerFeedbackfeedRedirectView(**kwargs)
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- class devilry.devilry_group.views.examiner.feedbackfeed_examiner.App(appname, request, active_viewname)
- appurls = [<cradmin_legacy.crapp.Url object>, <cradmin_legacy.crapp.Url object>, <cradmin_legacy.crapp.Url object>, <cradmin_legacy.crapp.Url object>, <cradmin_legacy.crapp.Url object>, <cradmin_legacy.crapp.Url object>, <cradmin_legacy.crapp.Url object>]
See
get_appurls()
.
Admin view
- class devilry.devilry_group.views.admin.feedbackfeed_admin.AdminBaseFeedbackFeedView(**kwargs)
Base view for admin.
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_hard_deadline_info_text()
Get hard deadline info text. Must be implemented in subclasses.
Uses function
get_devilry_hard_deadline_info_text
.- Returns:
info text.
- Return type:
str
- get_devilryrole()
Get the devilryrole of a user. This function must be implemented by a subclass.
- Raises:
NotImplementedError – Raised if not implemented by subclass.
- set_automatic_attributes(obj)
Called by
save_object()
to set automatic attributes for the object before it is saved.This is where we handle
roleid_field
, but you can override this to set your own automatic attributes. Just remember to callsuper
if you want to keep theroleid_field
magic.- Parameters:
obj – The object you are about to save.
- get_context_data(**kwargs)
Sets the context data needed to render elements in the template.
- Parameters:
**kwargs (dict) – Parameters to get_context_data.
- Returns:
The context data dictionary.
- Return type:
dict
- class devilry.devilry_group.views.admin.feedbackfeed_admin.AdminPublicDiscussView(**kwargs)
Admin view for public discussions.
Discussing with everyone on the
AssignmentGroup
.Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_form_heading_text_template_name()
Get template for rendering a heading text in the form.
Override this to provide an explanatory text added to the heading of the form for posting a comment. This should include some information about what happens when a comment is posted.
- Returns:
a string or path to html template or None.
- Return type:
(str)
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- perform_after_save(comment)
This method is called if the comment posted is saved and commit is
True
. This means that both the comment and files uploaded with it is saved in the database.Override this function for operations that require that the comment is saved, such as email sending etc.
- get_success_url()
Return the URL to redirect to after processing a valid form.
- class devilry.devilry_group.views.admin.feedbackfeed_admin.AdminWithExaminersDiscussView(**kwargs)
Admin view for between admins and examiners.
Discussing with admins and examiners only on the
AssignmentGroup
.Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_form_heading_text_template_name()
Get template for rendering a heading text in the form.
Override this to provide an explanatory text added to the heading of the form for posting a comment. This should include some information about what happens when a comment is posted.
- Returns:
a string or path to html template or None.
- Return type:
(str)
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- perform_after_save(comment)
This method is called if the comment posted is saved and commit is
True
. This means that both the comment and files uploaded with it is saved in the database.Override this function for operations that require that the comment is saved, such as email sending etc.
- get_success_url()
Return the URL to redirect to after processing a valid form.
- class devilry.devilry_group.views.admin.feedbackfeed_admin.AdminEditGroupCommentView(**kwargs)
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
Student view
- class devilry.devilry_group.views.student.feedbackfeed_student.StudentFeedbackFeedView(**kwargs)
Student view. Handles what should be rendered for a student on the FeedbackFeed.
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- get_form_heading_text_template_name()
Get template for rendering a heading text in the form.
Override this to provide an explanatory text added to the heading of the form for posting a comment. This should include some information about what happens when a comment is posted.
- Returns:
a string or path to html template or None.
- Return type:
(str)
- get_hard_deadline_info_text()
Get hard deadline info text. Must be implemented in subclasses.
Uses function
get_devilry_hard_deadline_info_text
.- Returns:
info text.
- Return type:
str
- get_devilryrole()
Get the devilryrole for the view.
- Returns:
student
as devilryrole.- Return type:
str
- get_buttons()
Get buttons for the form, normally one or more submit button.
Each button must be a crispy form layout object, typically some subclass of
crispy_forms.layout.Submit
.- See:
This method is used by
get_button_layout()
.
- set_automatic_attributes(obj)
Called by
save_object()
to set automatic attributes for the object before it is saved.This is where we handle
roleid_field
, but you can override this to set your own automatic attributes. Just remember to callsuper
if you want to keep theroleid_field
magic.- Parameters:
obj – The object you are about to save.
- save_object(form, commit=False)
How post of the comment should be handled. This can be handled more specifically in subclasses.
Add call to super in the subclass implementation on override.
- Parameters:
form (GroupCommentForm) – Posted form.
commit (bool) – If form-object(
GroupComment
) should be saved.
- Returns:
The form-object
GroupComment
.- Return type:
- perform_after_save(comment)
This method is called if the comment posted is saved and commit is
True
. This means that both the comment and files uploaded with it is saved in the database.Override this function for operations that require that the comment is saved, such as email sending etc.
- class devilry.devilry_group.views.student.feedbackfeed_student.StudentEditGroupComment(**kwargs)
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
Using ListBuilder to render the feedbackfeed.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.TimeLineListBuilderList
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.FeedbackSetTimelineListBuilderList(feedbackset, group, assignment, requestuser, devilryrole)
A list of all events for a specific
FeedbackSet
.- classmethod from_built_timeline(built_timeline, feedbackset, attempt_num, **kwargs)
Creates a instance of TimelineListBuilderList.
Appends events from built_timeline.
- Parameters:
built_timeline – The built and sorted feedbackfeed timeline
feedbackset – The
FeedbackSet
the events belong to.attempt_num – The chronological number of the feedbackset.
- Returns:
listbuilder instance.
- Return type:
TimelineListBuilderList
- get_item_value(event_dict)
Creates a ItemValueRenderer based on the event type.
- If the event type is comment:
create and return a StudentGroupCommentItemValue, ExaminerGroupCommentItemValue or AdminGroupCommentItemValue.
- If the event type is deadline_created:
create and return a DeadlineCreatedItemValue.
- If the event type is deadline_expired:
create and return a DeadlineExpiredItemValue.
- If the event type is grade:
create and return a DeadlineExpiredItemValue.
- Parameters:
event_dict – Event metadata dictionary.
- Returns:
Subclass of BaseItemValue.
- Return type:
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.FeedbackSetContentList(feedbackset, renderables_list)
Simply adds a css wrapper-class for all events that belong to a feedbackset.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.BaseItemValue(*args, **kwargs)
Base class for all items in the list.
- Parameters:
value – The value to render.
- property devilry_viewrole
Get the devilry role for the view.
- Returns:
‘student’, ‘examiner’ or a admin role.
- Return type:
str
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.BaseEventItemValue(*args, **kwargs)
Base class for all events.
Superclass for all events that occur in the timeline such as
deadline created
,deadline expired
,grading passed
andgrading failed
.- Parameters:
value – The value to render.
- get_timeline_datetime()
Get the timeline datetime for the event.
- Returns:
The event datetime
- Return type:
DateTime
- Raises:
NotImplementedError – if not implemented.
- get_base_css_classes_list()
Override this to set your own css classes.
- property changed_by_user_id
ID of the user that made the change.
This must be implemented in each subclass as this dependent on the model-obj set as self.value.
- Returns:
A user ID.
- Return type:
int
- property show_changed_by_user
If the user should be rendered, based on the the role of the requestuser and if the assignment is anonymized.
- Returns:
True
- Return type:
bool
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.FeedbackSetCreatedItemValue(attempt_num, assignment, *args, **kwargs)
- Parameters:
value – The value to render.
- valuealias = 'feedbackset'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.BaseGroupCommentItemValue(requestuser, *args, **kwargs)
Base class for a GroupComment item.
Superclass for the different types of comments(student-comment, examiner-comment and admin-comment).
- Parameters:
value – The value to render.
- valuealias = 'group_comment'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- include_edit_links()
Render links for editing GroupComment.
- include_badge()
Include right-hand-badge with comment-info in GroupComment.
- include_published_last_edited_datetime()
Include the last published datetime, or edited datetime if edited, in GroupComment.
- include_files()
Render uploaded files for a GroupComment.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.StudentGroupCommentItemValue(requestuser, *args, **kwargs)
Student
GroupComment
.- Parameters:
value – The value to render.
- valuealias = 'group_comment'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.StudentGroupCommentItemValueMinimal(requestuser, *args, **kwargs)
Student
GroupComment
minimal renderable.Only shows the publish datetime, user, and text. Files and badges are excluded
- Parameters:
value – The value to render.
- valuealias = 'group_comment'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- include_edit_links()
Render links for editing GroupComment.
- include_badge()
Include right-hand-badge with comment-info in GroupComment.
- include_published_last_edited_datetime()
Include the last published datetime, or edited datetime if edited, in GroupComment.
- include_files()
Render uploaded files for a GroupComment.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.ExaminerGroupCommentItemValue(requestuser, *args, **kwargs)
Examiner
GroupComment
.- Parameters:
value – The value to render.
- valuealias = 'group_comment'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.ExaminerGroupCommentItemValueMinimal(requestuser, *args, **kwargs)
- Parameters:
value – The value to render.
- include_edit_links()
Render links for editing GroupComment.
- include_badge()
Include right-hand-badge with comment-info in GroupComment.
- include_published_last_edited_datetime()
Include the last published datetime, or edited datetime if edited, in GroupComment.
- include_files()
Render uploaded files for a GroupComment.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.AdminGroupCommentItemValue(requestuser, *args, **kwargs)
Admin
GroupComment
.- Parameters:
value – The value to render.
- valuealias = 'group_comment'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.AdminGroupCommentItemValueMinimal(requestuser, *args, **kwargs)
- Parameters:
value – The value to render.
- include_edit_links()
Render links for editing GroupComment.
- include_badge()
Include right-hand-badge with comment-info in GroupComment.
- include_published_last_edited_datetime()
Include the last published datetime, or edited datetime if edited, in GroupComment.
- include_files()
Render uploaded files for a GroupComment.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.AbstractDeadlineEventItemValue(*args, **kwargs)
Abstract class for deadline events.
- Parameters:
value – The value to render.
- valuealias = 'deadline_datetime'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_timeline_datetime()
Get the timeline datetime for the event.
- Returns:
The event datetime
- Return type:
DateTime
- Raises:
NotImplementedError – if not implemented.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.DeadlineMovedItemValue(is_last=False, *args, **kwargs)
Deadline moved event.
- Parameters:
value – The value to render.
- valuealias = 'feedbackset_history_obj'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_timeline_datetime()
Get the timeline datetime for the event.
- Returns:
The event datetime
- Return type:
DateTime
- Raises:
NotImplementedError – if not implemented.
- property changed_by_user_id
ID of the user that made the change.
This must be implemented in each subclass as this dependent on the model-obj set as self.value.
- Returns:
A user ID.
- Return type:
int
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.DeadlineExpiredItemValue(*args, **kwargs)
Deadline expired event.
- Parameters:
value – The value to render.
- valuealias = 'deadline_datetime'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.GradeItemValue(*args, **kwargs)
Grading event.
- Parameters:
value – The value to render.
- valuealias = 'feedbackset'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- property changed_by_user_id
ID of the user that made the change.
This must be implemented in each subclass as this dependent on the model-obj set as self.value.
- Returns:
A user ID.
- Return type:
int
- get_timeline_datetime()
Get the timeline datetime for the event.
- Returns:
The event datetime
- Return type:
DateTime
- Raises:
NotImplementedError – if not implemented.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
- class devilry.devilry_cradmin.devilry_listbuilder.feedbackfeed_timeline.GradingUpdatedItemValue(*args, **kwargs)
- Parameters:
value – The value to render.
- valuealias = 'grading_updated'
If this is specified, we will add an attribute with this name for the value as an attribute of the object.
I.e.: if
valuealias = "person"
, you will be able to useme.person
in the template, and you will be able to useself.person
in any methods you add or override in the class (just remember to callsuper()
if you override__init__
).
- property changed_by_user_id
ID of the user that made the change.
This must be implemented in each subclass as this dependent on the model-obj set as self.value.
- Returns:
A user ID.
- Return type:
int
- get_timeline_datetime()
Get the timeline datetime for the event.
- Returns:
The event datetime
- Return type:
DateTime
- Raises:
NotImplementedError – if not implemented.
- get_extra_css_classes_list()
Override this to set your own css classes. Must return a list of css classes.
This is reserved for setting css classes when extending a reusable component.
See
get_css_classes_string()
.
Writing tests
In most cases, just using model_bakery
(baker.make) should be enough,
but we provide some factory-methods that makes this a bit easier.
Example - create a group with two “attempts”
testgroup = baker.make('core.AssignmentGroup',
parentnode__first_deadline=timezone.now() - timedelta(days=10)
devilry_group_baker_factories.feedbackset_first_attempt_published(
group=testgroup,
grading_points=10,
deadline_datetime=timezone.now() - timedelta(days=10),
is_last_in_group=False)
devilry_group_baker_factories.feedbackset_new_attempt_published(
group=testgroup,
grading_points=20,
is_last_in_group=True)
- devilry.devilry_group.devilry_group_baker_factories.feedbackset_save(feedbackset, **kwargs)
Set attributes for a FeedbackSet-instance and save it.
- Parameters:
feedbackset – FeedbackSet to save.
- devilry.devilry_group.devilry_group_baker_factories.make_first_feedbackset_in_group(group=None, **feedbackset_attributes)
Get the first feedbackset in a group, and optionally update some attributes.
This is designed to be used instead of
baker.make('devilry_group.FeedbackSet')
when you just want a FeedbackSet since that does not work because the postgres triggers automatically create the first feedbackset in each created AssignmentGroup.Examples
Create a FeedbackSet:
feedbackset = devilry_group_baker_factories.make_first_feedbackset_in_group()
With attributes:
feedbackset = devilry_group_baker_factories.make_first_feedbackset_in_group( ignored_reason='Test')
With pre-existing AssignmentGroup:
group = baker.make('core.AssignmentGroup') feedbackset = devilry_group_baker_factories.make_first_feedbackset_in_group( group=group)
Create AssignmentGroup with attributes:
group = baker.make('core.AssignmentGroup') feedbackset = devilry_group_baker_factories.make_first_feedbackset_in_group( group__parentnode__short_name='assignment1', group__parentnode__parentnode__short_name='period1')
- Parameters:
group (devilry.apps.core.models.assignment_group.AssignmentGroup) – An AssignmentGroup. If this is
None
, the group is created using baker.make(), and all the attributes infeedbackset_attributes
starting withgroup__
.**feedbackset_attributes – Optional attributes for the feedbackset. If provided, the feedbackset is updated with these attributes (and saved to the database). Does not clean before saving.
- Returns:
- The retrieved
(and updated if feedbackset_attributes is provided) FeedbackSet.
- Return type:
- devilry.devilry_group.devilry_group_baker_factories.feedbackset_first_attempt_published(group=None, grading_published_datetime=None, grading_points=1, **kwargs)
Updates the autogenerated FeedbackSet.
Creates a published FeedbackSet with
feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_NEW_ATTEMPT
usingbaker.make('devilry_group.FeedbackSet)
.- Note::
If no group is passed as parameter(param group is None), an AssignmentGroup will be created which triggers an automatic creation of a FeedbackSet. This is the FeedbackSet that is returned. An examiner is also autogenerated for FeedbackSet.grading_published_by.
- Parameters:
group – AssignmentGroup for the first FeedbackSet.
grading_published_datetime – The
grading_published_datetime
of the feedbackset. Defaults totimezone.now()
if not specified.grading_points – The
grading_points
of the feedbackset. Defaults to1
.kwargs – Other attributes for FeedbackSet.
- Returns:
Instance of the first FeedbackSet.
- Return type:
- devilry.devilry_group.devilry_group_baker_factories.feedbackset_first_attempt_unpublished(group=None, **kwargs)
Creates a unpublished FeedbackSet with
feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_NEW_ATTEMPT
usingbaker.make('devilry_group.FeedbackSet)
.- Note::
If no group is passed as parameter(param group is None), an AssignmentGroup will be created which triggers an automatic creation of a FeedbackSet. This is the FeedbackSet that is returned.
- Parameters:
group – AssignmentGroup for the first FeedbackSet.
kwargs – Other attributes for FeedbackSet.
- Returns:
Instance of the first FeedbackSet.
- Return type:
- devilry.devilry_group.devilry_group_baker_factories.feedbackset_new_attempt_published(group, grading_published_datetime=None, grading_points=1, **kwargs)
Creates a published FeedbackSet with
feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_NEW_ATTEMPT
usingbaker.make('devilry_group.FeedbackSet)
.- Parameters:
group – The AssignmentGroup the FeedbackSet should belong to.
grading_published_datetime – The
grading_published_datetime
of the feedbackset. Defaults totimezone.now()
if not specified.grading_points – The
grading_points
of the feedbackset. Defaults to1
.kwargs – Other attributes for FeedbackSet.
- Returns:
The created FeedbackSet.
- Return type:
- devilry.devilry_group.devilry_group_baker_factories.feedbackset_new_attempt_unpublished(group, **kwargs)
Creates a unpublished FeedbackSet with
feedbackset_type=FeedbackSet.FEEDBACKSET_TYPE_NEW_ATTEMPT
usingbaker.make('devilry_group.FeedbackSet)
.- Parameters:
group – The AssignmentGroup the FeedbackSet should belong to.
kwargs – Other attributes for FeedbackSet.
- Returns:
The created FeedbackSet.
- Return type:
- devilry.devilry_group.devilry_group_baker_factories.temporary_file_collection_with_tempfile(**collection_attributes)
Create a
cradmin_legacy.apps.cradmin_temporaryfileuploadstore.models.TemporaryFileCollection
usingbaker.make('cradmin_temporaryfileuploadstore.TemporaryFileCollection')
with a attached defaultcradmin_legacy.apps.cradmin_temporaryfileuploadstore.models.TemporaryFile
.- Note::
Use this if you don’t care for the actual file, only that a file is added.
- Parameters:
**temporary_filecollection_attributes – Attributes for TemporaryFileCollection.
- Returns:
TemporaryFileCollection instance.
- Return type:
cradmin_temporaryfileuploadstore.TemporaryFileCollection
- devilry.devilry_group.devilry_group_baker_factories.temporary_file_collection_with_tempfiles(file_list=None, **collection_attributes)
Create a
cradmin_legacy.apps.cradmin_temporaryfileuploadstore.models.TemporaryFileCollection
usingbaker.make('cradmin_temporaryfileuploadstore.TemporaryFileCollection')
.Add files to the
file_list
, preferably Django`sSimpleUploadedFile
.Examples
Create a TemporaryFileCollection with TemporaryFiles (adds 3 files):
devilry_group_baker_factories.temporary_file_collection_with_tempfiles( file_list=[ SimpleUploadedFile(name='testfile1.txt', content=b'Test content 1', content_type='text/txt'), SimpleUploadedFile(name='testfile1.txt', content=b'Test content 1', content_type='text/txt'), SimpleUploadedFile(name='testfile1.txt', content=b'Test content 1', content_type='text/txt') ], # attributes for the TemporaryFileCollection ... )
- Parameters:
file_list – A list of files implementing the general attributes of a file.
**collection_attributes – Attributes for TemporaryFileCollection.
- Returns:
TemporaryFileCollection.
- Return type:
cradmin_temporaryfileuploadstore.TemporaryFileCollection