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

« back to all changes in this revision

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

  • Committer: Matt Giuca
  • Date: 2010-02-25 08:21:47 UTC
  • Revision ID: matt.giuca@gmail.com-20100225082147-tus03ah630n74156
ProjectSet view: Prettied up the group management interface, including fixing delete icons.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
# Author: Nick Chadwick
19
19
 
 
20
import datetime
 
21
 
 
22
import formencode
 
23
import formencode.validators
 
24
 
20
25
import ivle.database
21
26
from ivle.database import ProjectSet, Project, Subject, Semester, Offering
22
27
 
 
28
from ivle.webapp.base.forms import VALID_URL_NAME
23
29
from ivle.webapp.base.rest import (XHTMLRESTView, named_operation,
24
30
                                   require_permission)
25
 
from ivle.webapp.errors import NotFound
 
31
from ivle.webapp.errors import NotFound, BadRequest
26
32
 
27
33
class ProjectSetRESTView(XHTMLRESTView):
28
34
    """Rest view for a projectset.
29
35
    
30
36
    Add new, delete, edit functionality is given here."""
31
37
    template = "templates/projectset_fragment.html"
32
 
    
33
 
    def __init__(self, req, subject, year, semester, projectset):
34
 
        self.context = req.store.find(ProjectSet,
35
 
            ProjectSet.id == int(projectset),
36
 
            ProjectSet.offering_id == Offering.id,
37
 
            Offering.subject_id == Subject.id,
38
 
            Subject.short_name == unicode(subject),
39
 
            Offering.semester_id == Semester.id,
40
 
            Semester.year == unicode(year),
41
 
            Semester.semester == unicode(semester)).one()
42
 
        
43
 
        if self.context is None:
44
 
            raise NotFound()
45
38
 
46
39
    def _project_url(self, project):
47
40
        return "/subjects/%s/%s/%s/+projects/%s" % \
51
44
                 project.short_name)
52
45
 
53
46
    @named_operation('edit')
54
 
    def add_project(self, req, name, short_name, synopsis):
 
47
    def add_project(self, req, name, short_name, deadline, synopsis, url):
55
48
        """Add a Project to this ProjectSet"""
 
49
        if not VALID_URL_NAME.match(short_name):
 
50
            raise BadRequest(
 
51
                "Project names must consist of a lowercase alphanumeric "
 
52
                "character followed by any number of lowercase alphanumerics, "
 
53
                "., +, - or _.")
 
54
 
 
55
        if req.store.find(
 
56
            Project,
 
57
            Project.short_name == unicode(short_name),
 
58
            Project.project_set_id == ProjectSet.id,
 
59
            ProjectSet.offering == self.context.offering).one():
 
60
            raise BadRequest(
 
61
                "A project with that URL name already exists in this offering."
 
62
                )
 
63
 
 
64
        try:
 
65
            formencode.validators.URL().to_python(url)
 
66
        except formencode.Invalid, e:
 
67
            raise BadRequest(str(e))
 
68
 
56
69
        new_project = Project()
57
70
        new_project.name = unicode(name)
58
71
        new_project.short_name = unicode(short_name)
 
72
        new_project.url = unicode(url)
59
73
        new_project.synopsis = unicode(synopsis)
 
74
        try:
 
75
            new_project.deadline = datetime.datetime.strptime(deadline, '%Y-%m-%d %H:%M:%S')
 
76
        except ValueError:
 
77
            raise BadRequest("deadline must be in YYYY-MM-DD HH:MM:ss")
60
78
        new_project.project_set = self.context
61
79
 
62
80
        req.store.add(new_project)
63
81
        req.store.flush()
64
82
    
65
83
        self.template = "templates/project_fragment.html"
 
84
        self.ctx['req'] = req
66
85
        self.ctx['project'] = new_project
67
 
        self.ctx['project_url'] = self._project_url(new_project)
68
86
 
69
87
        return {'success': True, 'projectset_id': self.context.id}
70
 
 
71
 
class ProjectRESTView(XHTMLRESTView):
72
 
    """Rest view for a project."""