| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| from pylons import tmpl_context as c |
| |
| import ew as ew_core |
| from ew import jinja2_ew as ew |
| import formencode |
| from formencode import validators as fev |
| |
| from allura import model as M |
| from allura.lib import validators as V |
| from allura.lib.widgets import forms as ff |
| from allura.lib.widgets import form_fields as ffw |
| |
| from bson import ObjectId |
| |
| |
| class CardField(ew._Jinja2Widget): |
| template = 'jinja:allura.ext.admin:templates/admin_widgets/card_field.html' |
| sort_key = None |
| defaults = dict( |
| ew_core.Widget.defaults, |
| id=None, |
| name='Deck', |
| icon_name='group', |
| items=None, |
| roles=[], |
| settings_href=None) |
| |
| def item_display(self, item): |
| return repr(item) |
| |
| def item_id(self, item): |
| return repr(item) |
| |
| def resources(self): |
| yield ew.CSSScript('''.deck li input, .deck li select { |
| margin: 2px 0 2px 3px; |
| width: 148px; |
| }''') |
| yield ew.JSScript('''$(function() { |
| $('.active-card').each(function() { |
| var newitem = $('.new-item', this); |
| var adder = $('.adder', this); |
| var deleters = $('.deleter', this); |
| newitem.remove(); |
| newitem.removeClass('new-item'); |
| deleters.click(function(evt) { |
| evt.stopPropagation(); |
| evt.preventDefault(); |
| var $this = $(this); |
| $this.closest('li').remove(); |
| }); |
| adder.click(function(evt) { |
| evt.stopPropagation(); |
| evt.preventDefault(); |
| newitem.clone().insertBefore(adder.closest('li')); |
| }); |
| }); |
| });''') |
| |
| |
| class GroupCard(CardField): |
| new_item = ew.InputField( |
| field_type='text', attrs=dict(placeholder='type a username')) |
| sort_key = 'user.username' |
| |
| def item_display(self, item): |
| return item.user.username |
| |
| def item_id(self, item): |
| return item.user._id |
| |
| def role_name(self, role_id): |
| return M.ProjectRole.query.get(_id=ObjectId(role_id)).name |
| |
| |
| class _GroupSelect(ew.SingleSelectField): |
| |
| def options(self): |
| auth_role = M.ProjectRole.authenticated() |
| anon_role = M.ProjectRole.anonymous() |
| options = [ |
| ew.Option(py_value=role._id, label=role.name) |
| for role in c.project.named_roles] |
| options.append(ew.Option(py_value=auth_role._id, label=auth_role.name)) |
| options.append(ew.Option(py_value=anon_role._id, label=anon_role.name)) |
| return options |
| |
| |
| class PermissionCard(CardField): |
| new_item = _GroupSelect() |
| sort_key = 'name' |
| |
| def item_display(self, role): |
| return role.name |
| |
| def item_id(self, role): |
| return role._id |
| |
| |
| class GroupSettings(ff.CsrfForm): |
| submit_text = None |
| |
| @property |
| def hidden_fields(self): |
| f = super(GroupSettings, self).hidden_fields |
| f.append(ew.HiddenField(name='_id', validator=V.Ming(M.ProjectRole))) |
| return f |
| |
| class fields(ew_core.NameList): |
| name = ew.InputField(label='Name') |
| |
| class buttons(ew_core.NameList): |
| save = ew.SubmitButton(label='Save') |
| delete = ew.SubmitButton(label='Delete Group') |
| |
| |
| class NewGroupSettings(ff.AdminForm): |
| submit_text = 'Save' |
| |
| class fields(ew_core.NameList): |
| name = ew.InputField(label='Name') |
| |
| |
| class ScreenshotAdmin(ff.AdminForm): |
| defaults = dict( |
| ff.AdminForm.defaults, |
| enctype='multipart/form-data') |
| |
| @property |
| def fields(self): |
| fields = [ |
| ew.InputField(name='screenshot', field_type='file', |
| label='New Screenshot'), |
| ew.InputField(name='caption', field_type="text", label='Caption') |
| ] |
| return fields |
| |
| |
| class MetadataAdmin(ff.AdminForm): |
| template = 'jinja:allura.ext.admin:templates/admin_widgets/metadata_admin.html' |
| defaults = dict( |
| ff.AdminForm.defaults, |
| show_export_control=False, |
| enctype='multipart/form-data') |
| |
| class fields(ew_core.NameList): |
| name = ew.InputField(field_type='text', |
| label='Name', |
| validator=formencode.All( |
| fev.UnicodeString(not_empty=True, max=40), |
| V.MaxBytesValidator(max=40)), |
| attrs=dict(maxlength=40, |
| title="This is the publicly viewable name of the project, and will appear on project listings. It should be what you want to see as the project title in search listing.")) |
| summary = ew.InputField(field_type="text", label='Short Summary', |
| validator=formencode.All( |
| fev.UnicodeString(max=70), |
| V.MaxBytesValidator(max=70)), |
| attrs=dict(maxlength=70)) |
| short_description = ew.TextArea(label='Full Description', |
| validator=formencode.All( |
| fev.UnicodeString(max=1000), |
| V.MaxBytesValidator(max=1000)), |
| attrs=dict(title="Add a few paragraphs describing your project to new users.")) |
| icon = ew.FileField(label='Icon') |
| external_homepage = ew.InputField(field_type="text", label='Homepage', |
| validator=fev.URL(add_http=True)) |
| video_url = ew.InputField(field_type="text", label="Video (YouTube)", |
| validator=V.YouTubeConverter()) |
| support_page = ew.InputField(field_type="text", label='Support Page') |
| support_page_url = ew.InputField( |
| field_type="text", label='Support Page URL', |
| validator=fev.URL(add_http=True, if_empty='')) |
| removal = ew.InputField(field_type="text", label='Removal') |
| moved_to_url = ew.InputField( |
| field_type="text", label='Moved Project to URL', |
| validator=fev.URL(add_http=True, if_empty='')) |
| export_controlled = ew.InputField( |
| field_type="text", label='Export Control') |
| export_control_type = ew.InputField( |
| field_type="text", label='Export Control Type') |
| delete = ew.InputField(field_type="hidden", label='Delete') |
| delete_icon = ew.InputField(field_type="hidden", label='Delete Icon') |
| undelete = ew.InputField(field_type="hidden", label='Undelete') |
| tracking_id = ew.InputField( |
| field_type="text", label="Analytics Tracking ID") |
| twitter_handle = ew.InputField( |
| field_type="text", label='Twitter Handle') |
| facebook_page = ew.InputField(field_type="text", label='Facebook page', |
| validator=fev.URL(add_http=True)) |
| |
| |
| class AuditLog(ew_core.Widget): |
| template = 'jinja:allura.ext.admin:templates/widgets/audit.html' |
| defaults = dict( |
| ew_core.Widget.defaults, |
| entries=None, |
| limit=None, |
| page=0, |
| count=0) |
| |
| class fields(ew_core.NameList): |
| page_list = ffw.PageList() |
| page_size = ffw.PageSize() |
| |
| def resources(self): |
| for f in self.fields: |
| for r in f.resources(): |
| yield r |
| |
| |
| class BlockUser(ffw.Lightbox): |
| defaults = dict( |
| ffw.Lightbox.defaults, |
| name='block-user-modal', |
| trigger='a.block-user', |
| content_template='allura.ext.admin:templates/widgets/block_user.html') |
| |
| |
| class BlockList(ffw.Lightbox): |
| defaults = dict( |
| ffw.Lightbox.defaults, |
| name='block-list-modal', |
| trigger='a.block-list', |
| content_template='allura.ext.admin:templates/widgets/block_list.html') |