~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/webapp/admin/subject.py

  • Committer: William Grant
  • Date: 2010-07-27 10:25:59 UTC
  • Revision ID: grantw@unimelb.edu.au-20100727102559-cvt3fhlaiaknd5bp
Validate uniqueness of Subject.code at the form layer, so we don't crash due to DB constraints.

Show diffs side-by-side

added added

removed removed

Lines of Context:
107
107
            Semester.year, Semester.semester)
108
108
 
109
109
 
110
 
class SubjectShortNameUniquenessValidator(formencode.FancyValidator):
111
 
    """A FormEncode validator that checks that a subject name is unused.
 
110
class SubjectUniquenessValidator(formencode.FancyValidator):
 
111
    """A FormEncode validator that checks that a subject attribute is unique.
112
112
 
113
113
    The subject referenced by state.existing_subject is permitted
114
114
    to hold that name. If any other object holds it, the input is rejected.
 
115
 
 
116
    :param attribute: the name of the attribute to check.
 
117
    :param display: a string to identify the field in case of error.
115
118
    """
116
 
    def __init__(self, matching=None):
117
 
        self.matching = matching
 
119
 
 
120
    def __init__(self, attribute, display):
 
121
        self.attribute = attribute
 
122
        self.display = display
118
123
 
119
124
    def _to_python(self, value, state):
120
 
        if (state.store.find(
121
 
                Subject, short_name=value).one() not in
 
125
        if (state.store.find(Subject, **{self.attribute: value}).one() not in
122
126
                (None, state.existing_subject)):
123
127
            raise formencode.Invalid(
124
 
                'Short name already taken', value, state)
 
128
                '%s already taken' % self.display, value, state)
125
129
        return value
126
130
 
127
131
 
128
132
class SubjectSchema(formencode.Schema):
129
133
    short_name = formencode.All(
130
 
        SubjectShortNameUniquenessValidator(),
 
134
        SubjectUniquenessValidator('short_name', 'URL name'),
131
135
        URLNameValidator(not_empty=True))
132
136
    name = formencode.validators.UnicodeString(not_empty=True)
133
 
    code = formencode.validators.UnicodeString(not_empty=True)
 
137
    code = formencode.All(
 
138
        SubjectUniquenessValidator('code', 'Subject code'),
 
139
        formencode.validators.UnicodeString(not_empty=True))
134
140
 
135
141
 
136
142
class SubjectFormView(BaseFormView):