Changeset 514
- Timestamp:
- 08/07/07 00:34:46 (1 year ago)
- Files:
-
- pagoda/trunk/Pagoda/pagoda/controllers/admin.py (modified) (2 diffs)
- pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/templates/admin/accounts.html (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/templates/admin/schedule.html (modified) (4 diffs)
- pagoda/trunk/Pagoda/pagoda/view/util.py (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/css/accounts.css (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/css/schedule.css (modified) (4 diffs)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/images/arrow-button-small-right.png (added)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/images/arrow-list-small-right.png (added)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/images/list-disabled.png (added)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/javascript/accounts.js (added)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/static/javascript/schedule.js (modified) (1 diff)
- pagoda/trunk/Pagoda/pagoda/widgets/admin/widgets.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pagoda/trunk/Pagoda/pagoda/controllers/admin.py
r509 r514 128 128 expiring_revisions.append((schedule_time, 1, content)) 129 129 130 scheduled_revisions = releasing_revisions + expiring_revisions 131 scheduled_revisions.sort() 132 133 pending_count = len(pending_revisions) 134 releasing_count = len(releasing_revisions) 135 expiring_count = len(expiring_revisions) 136 scheduled_count = len(scheduled_revisions) 137 130 138 return dict( 131 139 pending_revisions=pending_revisions, 132 140 releasing_revisions=releasing_revisions, 133 expiring_revisions=expiring_revisions 141 expiring_revisions=expiring_revisions, 142 scheduled_revisions=scheduled_revisions, 143 pending_count=pending_count, releasing_count=releasing_count, 144 expiring_count=expiring_count, scheduled_count=scheduled_count 134 145 ) 135 146 … … 222 233 223 234 @expose(template="genshi:pagoda.templates.admin.accounts", format="html") 224 @include_widgets('pagoda.widgets.admin.admin_base') 225 def index(self, *args, **kwargs): 226 return dict() 235 @include_widgets('pagoda.widgets.admin.accounts_base') 236 def index(self, *args, **kwargs): 237 users = models.User.query().order_by('user_name') 238 groups = models.Group.query().order_by('group_name') 239 permissions = models.Permission.query().order_by('permission_name') 240 return dict(users=users, groups=groups, permissions=permissions) 227 241 228 242 class PlaceholdersController(Controller): pagoda/trunk/Pagoda/pagoda/models/revision_mapper.py
r506 r514 253 253 else: 254 254 extension = RevisionableMapperExtension() 255 extensions.append(extension) 255 extensions.append(extension) # XXX: Testing! 256 256 kwargs['extension'] = extensions 257 257 pagoda/trunk/Pagoda/pagoda/templates/admin/accounts.html
r417 r514 19 19 20 20 <div id="body"> 21 <div id="columns"> 22 <form id="users" name="users" class="column"> 23 <h2>Users</h2> 24 <p class="actions-all"></p> 25 <ul> 26 <li py:for="i, user in enumerate(users)" class="${pagoda.util.even_odd(i)}"> 27 <h3 class="title"><a href="#" title="${user.display_name}">${user.user_name}</a></h3> 28 <button type="button" class="expand">Details</button> 29 <input type="hidden" name="user_id" value="${user.user_id}"/> 30 <input type="hidden" name="group_ids" value="${pagoda.util.id_list([group.group_id for group in user.groups])}"/> 31 <input type="hidden" name="permission_ids" value="${pagoda.util.id_list([permission.permission_id for permission in user.permissions])}"/> 32 </li> 33 </ul> 34 </form> 35 36 <form id="permissions" name="permissions" class="column"> 37 <h2>Permissions</h2> 38 <p class="actions-all"></p> 39 <ul> 40 <li py:for="i, permission in enumerate(permissions)" class="${pagoda.util.even_odd(i)}"> 41 <h3 class="title"><a href="#" title="${permission.description}">${permission.permission_name}</a></h3> 42 <button type="button" class="expand">Details</button> 43 <input type="hidden" name="permission_id" value="${permission.permission_id}"/> 44 <input type="hidden" name="user_ids" value="${pagoda.util.id_list([user.user_id for group in permission.groups for user in group.users])}"/> 45 <input type="hidden" name="group_ids" value="${pagoda.util.id_list([group.group_id for group in permission.groups])}"/> 46 </li> 47 </ul> 48 </form> 49 50 <form id="groups" name="groups" class="column"> 51 <h2>Groups</h2> 52 <p class="actions-all"></p> 53 <ul> 54 <li py:for="i, group in enumerate(groups)" class="${pagoda.util.even_odd(i)}"> 55 <h3 class="title"><a href="#" title="${group.display_name}">${group.group_name}</a></h3> 56 <button type="button" class="expand">Details</button> 57 <input type="hidden" name="group_id" value="${group.group_id}"/> 58 <input type="hidden" name="user_ids" value="${pagoda.util.id_list([user.user_id for user in group.users])}"/> 59 <input type="hidden" name="permission_ids" value="${pagoda.util.id_list([permission.permission_id for permission in group.permissions])}"/> 60 </li> 61 </ul> 62 </form> 63 <br clear="all"/> 64 </div> 21 65 </div> 22 66 pagoda/trunk/Pagoda/pagoda/templates/admin/schedule.html
r490 r514 16 16 17 17 <div id="body"> 18 <form id="pending" name="pending" action="pending" method="POST" class="schedule" 19 py:with="pending_count = len(pending_revisions)"> 18 <form id="pending" name="pending" action="pending" method="POST" class="schedule"> 20 19 <h2>Pending Changes</h2> 21 20 <p class="help"> … … 38 37 <py:for each="date, revisions in pagoda.util.groupby(enumerate(pending_revisions), lambda t: t[1].revision_time.date())"> 39 38 <div class="date-group">${pagoda.dates.short_date(date)}</div> 40 <li py:for="i, revision in revisions" class="${ i % 2 and 'odd' or 'even'}"39 <li py:for="i, revision in revisions" class="${pagoda.util.even_odd(i)}" 41 40 py:with="schedule = bool(revision.revision_release_time and revision.revision_release_time >= pagoda.now)"> 42 < a class="title"title="Click to preview • ${revision.title}" href="${tg.url('/content/live/%s/%s/' % (revision.content_type, revision.revision_id))}">41 <h3 class="title"><a title="Click to preview • ${revision.title}" href="${tg.url('/content/live/%s/%s/' % (revision.content_type, revision.revision_id))}"> 43 42 ${revision.title or "%s %d, revision %d" % (revision.content_type.title(), revision.content_id, revision.revision_id)} 44 </a> 43 </a></h3> 45 44 <p class="status"> 46 45 awaiting approval for … … 74 73 </ul> 75 74 </form> 76 <form id="scheduled" name="scheduled" action="scheduled" method="POST" class="schedule" 77 py:with="scheduled_revisions = pagoda.util.sorted(releasing_revisions + expiring_revisions); 78 releasing_count = len(releasing_revisions); 79 expiring_count = len(expiring_revisions); 80 scheduled_count = len(scheduled_revisions)"> 75 <form id="scheduled" name="scheduled" action="scheduled" method="POST" class="schedule"> 81 76 <h2>Scheduled Content</h2> 82 77 <p class="help"> … … 101 96 <div class="date-group">${pagoda.dates.short_date(date)}</div> 102 97 <li py:for="i, (schedule_time, is_expiration, revision) in revisions" 103 class="${ i % 2 and 'odd' or 'even'} ${is_expiration and 'expire' or 'release'}">104 < a class="title"href="${tg.url('/content/live/%s/%s/' % (revision.content_type, revision.revision_id))}">98 class="${pagoda.util.even_odd(i)} ${is_expiration and 'expire' or 'release'}"> 99 <h3 class="title"><a href="${tg.url('/content/live/%s/%s/' % (revision.content_type, revision.revision_id))}"> 105 100 ${revision.title} 106 </a> 101 </a></h3> 107 102 <p class="status" py:choose="is_expiration"> 108 103 <span py:when="0" py:strip=""> pagoda/trunk/Pagoda/pagoda/view/util.py
r475 r514 21 21 seq.reverse() 22 22 return seq 23 24 def even_odd(i, even='even', odd='odd'): 25 return i % 2 and odd or even 26 27 def id_list(seq): 28 return " ".join(map(str, seq)) pagoda/trunk/Pagoda/pagoda/widgets/admin/static/css/accounts.css
r417 r514 1 #body { 2 border-bottom: 5px solid #3465a4; 3 padding: 2em; 4 } 5 6 #columns { 7 width: 50em; 8 margin: 0 auto; 9 padding: 2em; 10 background: #fff; 11 border: 1px solid #bbb; 12 } 13 14 .column { 15 16 } 17 18 .column ul { 19 margin-top: 0.25em; 20 border-top: 1px dotted #999; 21 border-bottom: 1px dotted #999; 22 } 23 24 .column li { 25 text-align: left; 26 background-color: #ecf9fe; 27 padding-bottom: 0.25em; 28 } 29 30 .column li.odd { 31 background: #dcf2fa; 32 } 33 34 .column li .title a { 35 display: block; 36 padding: 0 0.5em; 37 } 38 39 .column li .title a:hover { 40 font-weight: bold; 41 } 42 43 .column li.selected { 44 background: #3465a4 url('../images/tab-active.png') repeat-x left top; 45 } 46 47 .column li.selected .title a { 48 color: #fff; 49 text-decoration: none; 50 } 51 52 .column li.selected button.expand { 53 color: #def; 54 } 55 56 .column li h3 { 57 font-size: 108%; 58 } 59 60 .column li .title { 61 font-weight: normal; 62 color: #345; 63 text-align: left; 64 } 65 66 .column li.active .title, 67 .column li.selected .title { 68 font-weight: bold; 69 } 70 71 .column li .details { 72 color: #6c8186; 73 text-align: right; 74 line-height: 160%; 75 } 76 77 .column li button.expand { 78 margin: 1px 0.75em 0 0.75em; 79 font-size: 85%; 80 color: #6c8186; 81 display: block; 82 background: transparent url('../images/arrow-list-small-right.png') no-repeat left 54%; 83 padding-left: 0.75em; 84 cursor: pointer; 85 } 86 87 #users { 88 float: left; 89 width: 31%; 90 } 91 92 #groups { 93 width: 32%; 94 margin: 0 auto; 95 } 96 97 #permissions { 98 float: right; 99 width: 31%; 100 } pagoda/trunk/Pagoda/pagoda/widgets/admin/static/css/schedule.css
r492 r514 59 59 } 60 60 61 .schedule ulli {61 .schedule li { 62 62 text-align: right; 63 63 padding: 0.5em; … … 65 65 } 66 66 67 .schedule ulli.odd {67 .schedule li.odd { 68 68 background: #dcf2fa; 69 69 } 70 70 71 .schedule ulli.empty {71 .schedule li.empty { 72 72 text-align: center; 73 73 } 74 74 75 .schedule ul li.approved, 76 .schedule ul li.dismissed { 75 .schedule li h3 { 76 margin: 0; 77 padding: 0; 78 line-height: 100%; 77 79 } 78 80 79 .schedule ul li.approved .status, 80 .schedule ul li.dismissed .status { 81 .schedule li.approved, 82 .schedule li.dismissed { 83 } 84 85 .schedule li.approved .status, 86 .schedule li.dismissed .status { 81 87 margin-bottom: 0; 82 88 font-weight: bold; 83 89 } 84 90 85 .schedule ulli.approved .title,86 .schedule ulli.dismissed .title {91 .schedule li.approved .title, 92 .schedule li.dismissed .title { 87 93 font-size: 100%; 88 94 } 89 95 90 .schedule ulli.approved .details,91 .schedule ulli.dismissed .details {96 .schedule li.approved .details, 97 .schedule li.dismissed .details { 92 98 display: none; 93 99 } 94 100 95 .schedule ulli.approved .actions,96 .schedule ulli.dismissed .actions {101 .schedule li.approved .actions, 102 .schedule li.dismissed .actions { 97 103 display: none; 98 104 } 99 105 100 .schedule ulli .title {106 .schedule li .title { 101 107 float: left; 102 108 font-size: 114%; … … 104 110 } 105 111 106 .schedule ulli .status {112 .schedule li .status { 107 113 color: #6c8186; 108 114 margin-bottom: 0.5em; 109 115 } 110 116 111 .schedule ulli .details {117 .schedule li .details { 112 118 float: left; 113 119 clear: left; … … 117 123 } 118 124 119 .schedule ulli .comment {125 .schedule li .comment { 120 126 float: left; 121 127 color: #999; pagoda/trunk/Pagoda/pagoda/widgets/admin/static/javascript/schedule.js
r492 r514 50 50 } 51 51 52 var setupListSubmit = function( info) {53 info.form.on('actioncomplete', info.success, info.form);54 info.form.on('actionfailed', info.failure, info.form);52 var setupListSubmit = function(setup) { 53 setup.form.on('actioncomplete', setup.success, setup.form); 54 setup.form.on('actionfailed', setup.failure, setup.form); 55 55 56 for (var name in info.one) {57 clickSubmits( info.form, info.one[name], info.selector);56 for (var name in setup.one) { 57 clickSubmits(setup.form, setup.one[name], setup.selector); 58 58 } 59 for (var name in info.all) {60 clickSubmitsAll( info.form, info.all[name], info.one[name], info.selector, info.filters);59 for (var name in setup.all) { 60 clickSubmitsAll(setup.form, setup.all[name], setup.one[name], setup.selector, setup.filters); 61 61 } 62 62 } pagoda/trunk/Pagoda/pagoda/widgets/admin/widgets.py
r511 r514 62 62 ) 63 63 64 accounts_ base= CSSLink(64 accounts_css = CSSLink( 65 65 modname=module_name, filename='static/css/accounts.css', 66 66 css=[admin_css] 67 ) 68 69 accounts_base = JSLink( 70 modname=module_name, filename='static/javascript/accounts.js', 71 css=[accounts_css], javascript=[admin_base, submit_params] 67 72 ) 68 73
