Skip to content

Assignment changes may not match changes submitted #3

Description

@onomou

The backend-frontend logic for what has changed when modifying an assignment is currently decoupled. Merge these to use the same checks.

Backend

filbert/script.py

Lines 908 to 941 in 3fa411c

else:
# update existing assignment
changes = {}
assignment = get_assignment(course_id, assignment_id)
response['external_tool_tag_attributes'] = getattr(assignment,'external_tool_tag_attributes',{}) | response.get('external_tool_tag_attributes', {})
if len(response['external_tool_tag_attributes']) == 0:
_ = response.pop('external_tool_tag_attributes', None)
# get differences between original and new data
for key, val in response.items():
if str(getattr(assignment,key,None)) != str(val):
changes[key] = {'old': getattr(assignment,key,None), 'new': val} # TODO: handle changes in sub-attributes, like external_tool_tag_attributes
if changes == {}:
diff_message += 'No changes to assignment'
else:
diff_message = '<h3>Assignment Differences</h3>'
diff_message += '<table class="diff-table" id="assignment-diff">'
# diff_message += '<tr><th colspan="3">Assignment Differences</th></tr>'
diff_message += '<tr><th>Field</th><th>Old Value</th><th>New Value</th></tr>'
changes_dict = {key: val['new'] for key, val in changes.items()}
old_values = {key: val['old'] for key, val in changes.items()}
log_action(f'assignment old values {old_values})')
log_action(f'assignment.edit(assignment={changes_dict})')
assignment.edit(assignment=changes_dict)
for field, change in changes.items():
# diff_message += '<em>' + field + '</em>: ' + str(change)
diff_message += '<tr>'
diff_message += '<td>' + field + '</td>'
diff_message += '<td>' + str(change['old']) + '</td>'
diff_message += '<td>' + str(change['new']) + '</td>'
diff_message += '</tr>'
diff_message += '</table>'
diff_message += '\n'
flash('<h2><a href="' + assignment.html_url + '" target="_blank" rel="noopener noreferrer">🔗 ' + assignment.name + '</a></h2>')
flash(diff_message)

Frontend

function initChangeHandler() {
document.querySelectorAll('input').forEach(input => {
// Gather initial values
if(input.type == "checkbox") {
initialValues[input.id] = input.checked
} else {
initialValues[input.id] = input.value;
}
// Add event listeners to input elements
input.addEventListener('input', handleInputChange);
});
document.querySelectorAll('select').forEach(input => {
// Gather initial values
initialValues[input.id] = [...input.selectedOptions].map(x => x.value);
// Add event listeners to input elements
input.addEventListener('change', handleInputChange);
});
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions