Browse Source

wip users

Rafał Pitoń 10 years ago
parent
commit
67d8d5a81a

+ 12 - 0
misago/emberapp/app/helpers/join-strings.js

@@ -0,0 +1,12 @@
+import Ember from 'ember';
+
+export function joinStrings() {
+  if (arguments.length > 1) {
+    var args = Array.prototype.slice.call(arguments, 0, arguments.length - 1);
+    return args.join('');
+  } else {
+    return '';
+  }
+}
+
+export default Ember.Handlebars.makeBoundHelper(joinStrings);

+ 2 - 2
misago/emberapp/app/mixins/document-title.js

@@ -18,8 +18,8 @@ export default Ember.Mixin.create({
 
 
     var complete_title = title.title;
     var complete_title = title.title;
 
 
-    if (typeof title.page !== 'undefined') {
-      complete_title += ' (' + interpolate(gettext('page %(page)s'), {page:title.page}, true) + ')';
+    if (typeof title.page !== 'undefined' && title.page > 1) {
+      complete_title += ' (' + interpolate(gettext('page %(page)s'), { page:title.page }, true) + ')';
     }
     }
 
 
     if (typeof title.parent !== 'undefined') {
     if (typeof title.parent !== 'undefined') {

+ 10 - 0
misago/emberapp/app/models/rank.js

@@ -0,0 +1,10 @@
+import DS from 'ember-data';
+import WithUrlName from 'misago/mixins/with-url-name';
+
+export default DS.Model.extend(WithUrlName, {
+  name: DS.attr('string'),
+  slug: DS.attr('string'),
+  description: DS.attr('string'),
+  css_class: DS.attr('string'),
+  is_tab: DS.attr('boolean')
+});

+ 8 - 1
misago/emberapp/app/router.js

@@ -27,7 +27,14 @@ Router.map(function() {
     });
     });
   });
   });
 
 
-  // User
+  // Users
+  this.route('users', { path: 'users/' }, function() {
+    this.route('rank', { path: ':slug/' }, function() {
+      this.route('page', { path: ':page/' });
+    });
+    this.route('online', { path: 'online/' });
+    this.route('active', { path: 'active/' });
+  });
 
 
   // User
   // User
   this.route('user', { path: 'user/:url_name/' });
   this.route('user', { path: 'user/:url_name/' });

+ 18 - 0
misago/emberapp/app/routes/misago.js

@@ -4,6 +4,24 @@ import ResetScroll from 'misago/mixins/reset-scroll';
 import ModelUrlName from 'misago/mixins/model-url-name';
 import ModelUrlName from 'misago/mixins/model-url-name';
 
 
 export default Ember.Route.extend(DocumentTitle, ResetScroll, ModelUrlName, {
 export default Ember.Route.extend(DocumentTitle, ResetScroll, ModelUrlName, {
+  // Shorthand for validating page number
+  cleanPage: function(page, transition) {
+    var cleanPage = parseInt(page);
+    if ("" + cleanPage === page && cleanPage > 0) {
+      if (cleanPage > 1) {
+        // return page number for an app
+        return cleanPage;
+      } else {
+        // redirect to first page
+        var routePath = transition.targetName.split('.');
+        routePath[routePath.length - 1] = 'index';
+        this.transitionTo(routePath.join('.'));
+      }
+    } else {
+      this.throw404(); // not a valid page number
+    }
+  },
+
   // Shorthands for raising errors
   // Shorthands for raising errors
   throw403: function(reason) {
   throw403: function(reason) {
     if (reason) {
     if (reason) {

+ 2 - 2
misago/emberapp/app/routes/options/index.js

@@ -1,7 +1,7 @@
 import MisagoRoute from 'misago/routes/misago';
 import MisagoRoute from 'misago/routes/misago';
 
 
 export default MisagoRoute.extend({
 export default MisagoRoute.extend({
-  redirectToForm: function() {
+  redirect: function() {
     return this.transitionTo('options.forum');
     return this.transitionTo('options.forum');
-  }.on('activate')
+  }
 });
 });

+ 1 - 0
misago/emberapp/app/routes/user.js

@@ -4,6 +4,7 @@ export default MisagoRoute.extend({
   usingUrlName: true,
   usingUrlName: true,
 
 
   model: function(params) {
   model: function(params) {
+    console.log(params);
     var urlName = this.getParsedUrlNameOr404(params.url_name);
     var urlName = this.getParsedUrlNameOr404(params.url_name);
     return this.store.find('user-profile', urlName.id);
     return this.store.find('user-profile', urlName.id);
   },
   },

+ 13 - 0
misago/emberapp/app/routes/users.js

@@ -0,0 +1,13 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  beforeModel: function() {
+    if (!this.auth.get('user.acl.can_browse_users_list')) {
+      this.throw403(gettext("You can't browse users list."));
+    }
+  },
+
+  model: function() {
+    return this.store.find('rank');
+  }
+});

+ 17 - 0
misago/emberapp/app/routes/users/active.js

@@ -0,0 +1,17 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  model: function(params) {
+    console.log(params);
+    return { val: 'nope' };
+  },
+
+  actions: {
+    didTransition: function() {
+      this.set('title', {
+        title: gettext('Most Active'),
+        parent: gettext('Users')
+      });
+    }
+  }
+});

+ 7 - 0
misago/emberapp/app/routes/users/index.js

@@ -0,0 +1,7 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  redirect: function() {
+    return this.transitionTo('users.active');
+  }
+});

+ 12 - 0
misago/emberapp/app/routes/users/online.js

@@ -0,0 +1,12 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  actions: {
+    didTransition: function() {
+      this.set('title', {
+        title: gettext('Online'),
+        parent: gettext('Users')
+      });
+    }
+  }
+});

+ 18 - 0
misago/emberapp/app/routes/users/rank.js

@@ -0,0 +1,18 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  model: function(params) {
+    var ranks = this.store.all('rank').filterBy('slug', params.slug);
+    if (ranks.length) {
+      return ranks.objectAt(0);
+    } else {
+      this.throw404();
+    }
+  },
+
+  afterModel: function(model) {
+    if (!model.get('is_tab')) {
+      this.throw404();
+    }
+  }
+});

+ 28 - 0
misago/emberapp/app/routes/users/rank/index.js

@@ -0,0 +1,28 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  model: function() {
+    return this.store.find('user', {
+      'list': 'rank',
+      'rank': this.modelFor('users.rank').get('slug')
+    });
+  },
+
+  templateName: 'users/rank',
+  setupController: function(controller, model) {
+    this.controllerFor('users.rank').setProperties({
+      'rank': this.modelFor('users.rank'),
+      'model': model,
+      'meta': model.get("meta")
+    });
+  },
+
+  actions: {
+    didTransition: function() {
+      this.set('title', {
+        title: this.modelFor('users.rank').get('name'),
+        parent: gettext('Users')
+      });
+    }
+  }
+});

+ 36 - 0
misago/emberapp/app/routes/users/rank/page.js

@@ -0,0 +1,36 @@
+import MisagoRoute from 'misago/routes/misago';
+
+export default MisagoRoute.extend({
+  page: 0,
+
+  model: function(params, transition) {
+    var page = this.cleanPage(params.page, transition);
+    if (page) {
+      this.set('page', page);
+
+      return this.store.find('user', {
+        'list': 'rank',
+        'rank': this.modelFor('users.rank').get('slug'),
+        'page': this.get('page')
+      });
+    }
+  },
+
+  templateName: 'users/rank',
+  setupController: function(controller, model) {
+    this.controllerFor('users.rank').setProperties({
+      'rank': this.modelFor('users.rank'),
+      'model': model,
+      'meta': model.get("content.meta")
+    });
+  },
+
+  actions: {
+    didTransition: function() {
+      this.set('title', {
+        title: this.modelFor('users.rank').get('name'),
+        parent: gettext('Users')
+      });
+    }
+  }
+});

+ 4 - 4
misago/emberapp/app/templates/components/forum-navbar.hbs

@@ -27,9 +27,9 @@
         </a>
         </a>
       </li>
       </li>
       <li>
       <li>
-        <a href="#">
+        {{#link-to "users"}}
           {{gettext "Users"}}
           {{gettext "Users"}}
-        </a>
+        {{/link-to}}
       </li>
       </li>
       <li>
       <li>
         <a href="#">
         <a href="#">
@@ -104,9 +104,9 @@
       </a>
       </a>
     </li>
     </li>
     <li>
     <li>
-      <a href="#">
+      {{#link-to "users"}}
         <i class="material-icons">group</i>
         <i class="material-icons">group</i>
-      </a>
+      {{/link-to}}
     </li>
     </li>
     <li>
     <li>
       <a href="#">
       <a href="#">

+ 38 - 0
misago/emberapp/app/templates/users.hbs

@@ -0,0 +1,38 @@
+<div class="users-page">
+
+  <div class="page-header">
+    <div class="container">
+
+      <h1>{{gettext "Users"}}</h1>
+
+      <ul class="nav nav-tabs">
+        {{#link-to "users.active" tagName="li" href=false}}
+          {{#link-to "users.active" bubbles=false activeClass=""}}
+            {{gettext "Most Active"}}
+          {{/link-to}}
+        {{/link-to}}
+
+        {{#if auth.user.acl.can_see_users_online_list}}
+          {{#link-to "users.online" tagName="li" href=false}}
+            {{#link-to "users.online" bubbles=false activeClass=""}}
+              {{gettext "Online Users"}}
+            {{/link-to}}
+          {{/link-to}}
+        {{/if}}
+
+        {{#each model as |rank|}}
+          {{#link-to "users.rank" rank tagName="li" href=false}}
+            {{#link-to "users.rank" rank bubbles=false activeClass=""}}
+              {{rank.name}}
+            {{/link-to}}
+          {{/link-to}}
+        {{/each}}
+      </ul>
+    </div>
+  </div>
+
+  <div class="container">
+    {{outlet}}
+  </div>
+
+</div>

+ 1 - 0
misago/emberapp/app/templates/users/active.hbs

@@ -0,0 +1 @@
+Active users!

+ 1 - 0
misago/emberapp/app/templates/users/online.hbs

@@ -0,0 +1 @@
+Online users!

+ 11 - 0
misago/emberapp/app/templates/users/rank.hbs

@@ -0,0 +1,11 @@
+{{rank.name}}
+
+{{join-strings 'lorem' 'ipsum' 'dolor' 'met'}}
+
+<hr>
+
+{{#each model as |user|}}
+  {{#link-to "user" user.url_name}}
+    {{user-avatar user=user size=200}}
+  {{/link-to}}
+{{/each}}

+ 9 - 0
misago/users/api/ranks.py

@@ -0,0 +1,9 @@
+from rest_framework import viewsets, mixins
+
+from misago.users.models import Rank
+from misago.users.serializers import RankSerializer
+
+
+class RanksViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
+    serializer_class = RankSerializer
+    queryset = Rank.objects.filter(is_tab=True).order_by('order')

+ 1 - 1
misago/users/api/userendpoints/list.py

@@ -76,7 +76,7 @@ def rank(request, queryset):
         return
         return
 
 
     rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
     rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=rank_slug)
-    queryset.filter(rank=rank)
+    queryset = queryset.filter(rank=rank)
 
 
     return {'queryset': queryset, 'paginate': True}
     return {'queryset': queryset, 'paginate': True}
 
 

+ 2 - 0
misago/users/urls/api.py

@@ -1,5 +1,6 @@
 from django.conf.urls import patterns, url
 from django.conf.urls import patterns, url
 from misago.core.apirouter import MisagoApiRouter
 from misago.core.apirouter import MisagoApiRouter
+from misago.users.api.ranks import RanksViewSet
 from misago.users.api.users import UserViewSet
 from misago.users.api.users import UserViewSet
 from misago.users.api.usernamechanges import UsernameChangesViewSet
 from misago.users.api.usernamechanges import UsernameChangesViewSet
 
 
@@ -17,6 +18,7 @@ urlpatterns += patterns('misago.users.api.captcha',
 )
 )
 
 
 router = MisagoApiRouter()
 router = MisagoApiRouter()
+router.register(r'ranks', RanksViewSet)
 router.register(r'users', UserViewSet)
 router.register(r'users', UserViewSet)
 router.register(r'username-changes', UsernameChangesViewSet)
 router.register(r'username-changes', UsernameChangesViewSet)
 urlpatterns += router.urls
 urlpatterns += router.urls