|
a/Allura/allura/controllers/project.py |
|
b/Allura/allura/controllers/project.py |
|
... |
|
... |
9 |
from tg.decorators import with_trailing_slash, without_trailing_slash
|
9 |
from tg.decorators import with_trailing_slash, without_trailing_slash
|
10 |
from pylons import c, g
|
10 |
from pylons import c, g
|
11 |
from webob import exc
|
11 |
from webob import exc
|
12 |
import pymongo
|
12 |
import pymongo
|
13 |
from formencode import validators
|
13 |
from formencode import validators
|
|
|
14 |
from formencode.api import Invalid
|
14 |
|
15 |
|
15 |
from ming.utils import LazyProperty
|
16 |
from ming.utils import LazyProperty
|
16 |
|
17 |
|
17 |
from allura import model as M
|
18 |
from allura import model as M
|
18 |
from allura.app import SitemapEntry
|
19 |
from allura.app import SitemapEntry
|
|
... |
|
... |
125 |
@without_trailing_slash
|
126 |
@without_trailing_slash
|
126 |
def add_project(self, **form_data):
|
127 |
def add_project(self, **form_data):
|
127 |
c.project = self.neighborhood.neighborhood_project
|
128 |
c.project = self.neighborhood.neighborhood_project
|
128 |
require_access(self.neighborhood, 'register')
|
129 |
require_access(self.neighborhood, 'register')
|
129 |
c.add_project = W.add_project
|
130 |
c.add_project = W.add_project
|
130 |
form_data['tools'] = ['Wiki', 'Git', 'Tickets', 'Downloads', 'Discussion']
|
131 |
form_data.setdefault('tools', [u'Wiki',u'Git',u'Tickets',u'Downloads',u'Discussion'])
|
131 |
form_data['neighborhood'] = self.neighborhood.name
|
132 |
form_data['neighborhood'] = self.neighborhood.name
|
132 |
return dict(neighborhood=self.neighborhood, form_data=form_data)
|
133 |
return dict(neighborhood=self.neighborhood, form_data=form_data)
|
133 |
|
134 |
|
134 |
@expose('json:')
|
135 |
@expose('json:')
|
135 |
def suggest_name(self, project_name=None):
|
136 |
def suggest_name(self, project_name=''):
|
|
|
137 |
result = dict()
|
136 |
new_name = re.sub("[^A-Za-z0-9]", "", project_name).lower()
|
138 |
result['suggested_name'] = re.sub("[^A-Za-z0-9]", "", project_name).lower()[:15]
|
137 |
name_taken_message = plugin.ProjectRegistrationProvider.get().name_taken(new_name, self.neighborhood)
|
139 |
return result
|
138 |
if len(new_name) < 3 or len(new_name) > 15:
|
|
|
139 |
name_taken_message = "Name must be 3-15 characters long."
|
|
|
140 |
return dict(suggested_name=new_name, message=name_taken_message)
|
|
|
141 |
|
140 |
|
142 |
@expose('json:')
|
141 |
@expose('json:')
|
143 |
def check_name(self, project_name=None):
|
142 |
def check_names(self, project_name='', unix_name=''):
|
144 |
name_taken_message = plugin.ProjectRegistrationProvider.get().name_taken(project_name, self.neighborhood)
|
143 |
result = dict()
|
145 |
if not name_taken_message and not h.re_path_portion.match(project_name):
|
144 |
try:
|
|
|
145 |
W.add_project.fields['project_name'].validate(project_name, '')
|
|
|
146 |
except Invalid as e:
|
|
|
147 |
result['name_message'] = str(e)
|
|
|
148 |
if not h.re_path_portion.match(unix_name) or not (3 <= len(unix_name) <= 15):
|
146 |
name_taken_message = 'Please use only letters, numbers, and dashes 3-15 characters long.'
|
149 |
result['unixname_message'] = 'Please use only letters, numbers, and dashes 3-15 characters long.'
|
147 |
return dict(message=name_taken_message)
|
150 |
else:
|
|
|
151 |
result['unixname_message'] = plugin.ProjectRegistrationProvider.get().name_taken(unix_name, self.neighborhood)
|
|
|
152 |
return result
|
148 |
|
153 |
|
149 |
@h.vardec
|
154 |
@h.vardec
|
150 |
@expose()
|
155 |
@expose()
|
151 |
@validate(W.add_project, error_handler=add_project)
|
156 |
@validate(W.add_project, error_handler=add_project)
|
152 |
@utils.AntiSpam.validate('Spambot protection engaged')
|
157 |
@utils.AntiSpam.validate('Spambot protection engaged')
|