mirror of https://github.com/jumpserver/jumpserver
				
				
				
			Modify pagination and Role model
							parent
							
								
									7789c8d13d
								
							
						
					
					
						commit
						e355c7b8ef
					
				| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
 | 
			
		||||
from django import template
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
register = template.Library()
 | 
			
		||||
| 
						 | 
				
			
			@ -18,3 +19,29 @@ def is_expired(datetime):
 | 
			
		|||
        return False
 | 
			
		||||
    else:
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@register.filter
 | 
			
		||||
def pagination_range(total_page, current_num=1, display=5):
 | 
			
		||||
    """Return Page range
 | 
			
		||||
 | 
			
		||||
    :param total_page: Total numbers of paginator
 | 
			
		||||
    :param current_num: current display page num
 | 
			
		||||
    :param display: Display as many as [:display:] page
 | 
			
		||||
 | 
			
		||||
    In order to display many page num on web like:
 | 
			
		||||
    < 1 2 3 4 5 >
 | 
			
		||||
    """
 | 
			
		||||
    try:
 | 
			
		||||
        current_num = int(current_num)
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        current_num = 1
 | 
			
		||||
 | 
			
		||||
    start = current_num - display/2 if current_num > display/2 else 1
 | 
			
		||||
    end = start + display if start + display <= total_page else total_page + 1
 | 
			
		||||
 | 
			
		||||
    return range(start, end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,21 +11,32 @@ https://docs.djangoproject.com/en/1.10/ref/settings/
 | 
			
		|||
"""
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 | 
			
		||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 | 
			
		||||
 | 
			
		||||
sys.path.append(os.path.dirname(BASE_DIR))
 | 
			
		||||
 | 
			
		||||
# Import project config setting
 | 
			
		||||
try:
 | 
			
		||||
    from config import config as env_config, env
 | 
			
		||||
    CONFIG = env_config.get(env, 'default')()
 | 
			
		||||
except ImportError:
 | 
			
		||||
    CONFIG = type('_', (), {'__getattr__': None})()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Quick-start development settings - unsuitable for production
 | 
			
		||||
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
 | 
			
		||||
 | 
			
		||||
# SECURITY WARNING: keep the secret key used in production secret!
 | 
			
		||||
SECRET_KEY = '2vym+ky!997d5kkcc64mnz06y1mmui3lut#(^wd=%s_qj$1%xv'
 | 
			
		||||
SECRET_KEY = CONFIG.SECRET_KEY or '2vym+ky!997d5kkcc64mnz06y1mmui3lut#(^wd=%s_qj$1%x'
 | 
			
		||||
 | 
			
		||||
# SECURITY WARNING: don't run with debug turned on in production!
 | 
			
		||||
DEBUG = True
 | 
			
		||||
DEBUG = CONFIG.DEBUG or False
 | 
			
		||||
 | 
			
		||||
ALLOWED_HOSTS = []
 | 
			
		||||
ALLOWED_HOSTS = CONFIG.ALLOWED_HOSTS or []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Application definition
 | 
			
		||||
| 
						 | 
				
			
			@ -80,12 +91,24 @@ WSGI_APPLICATION = 'jumpserver.wsgi.application'
 | 
			
		|||
# Database
 | 
			
		||||
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
 | 
			
		||||
 | 
			
		||||
DATABASES = {
 | 
			
		||||
    'default': {
 | 
			
		||||
        'ENGINE': 'django.db.backends.sqlite3',
 | 
			
		||||
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 | 
			
		||||
if CONFIG.DB_ENGINE == 'sqlite':
 | 
			
		||||
    DATABASES = {
 | 
			
		||||
        'default': {
 | 
			
		||||
            'ENGINE': 'django.db.backends.sqlite3',
 | 
			
		||||
            'NAME': CONFIG.DB_NAME or os.path.join(BASE_DIR, 'db.sqlite3'),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
else:
 | 
			
		||||
    DATABASES = {
 | 
			
		||||
        'default': {
 | 
			
		||||
            'ENGINE': 'django.db.backends.%s' % CONFIG.DB_ENGINE,
 | 
			
		||||
            'NAME': CONFIG.DB_NAME,
 | 
			
		||||
            'HOST': CONFIG.DB_HOST,
 | 
			
		||||
            'PORT': CONFIG.DB_PORT,
 | 
			
		||||
            'USER': CONFIG.DB_USERNAME,
 | 
			
		||||
            'PASSWORD': CONFIG.DB_PASSWORD,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Password validation
 | 
			
		||||
| 
						 | 
				
			
			@ -133,3 +156,5 @@ STATICFILES_DIRS = (
 | 
			
		|||
AUTH_USER_MODEL = 'users.User'
 | 
			
		||||
BOOTSTRAP_COLUMN_COUNT = 11
 | 
			
		||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/') + '/'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
{% load common_tags %}
 | 
			
		||||
{% if is_paginated %}
 | 
			
		||||
    <div class="row">
 | 
			
		||||
        <div class="col-sm-6">
 | 
			
		||||
| 
						 | 
				
			
			@ -9,17 +10,24 @@
 | 
			
		|||
            <div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
 | 
			
		||||
                <ul class="pagination" style="margin-top: 0; float: right">
 | 
			
		||||
                    {% if page_obj.has_previous %}
 | 
			
		||||
                        <li class="paginate_button previous" aria-controls="editable" tabindex="0"
 | 
			
		||||
                            id="editable_previous">
 | 
			
		||||
                            <a class="page" href="?page={{ page_obj.previous_page_number }}">Previous</a>
 | 
			
		||||
                        <li class="paginate_button previous" aria-controls="editable" tabindex="0" id="previous">
 | 
			
		||||
                            <a data-page="next" href="?page={{ page_obj.previous_page_number}}">‹</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                    <li class="paginate_button active" aria-controls="editable" tabindex="0">
 | 
			
		||||
                        <a class="page" href="?page={{ page_obj.number }}" title="第{{ page_obj.number }}页">{{ page_obj.number }}</a>
 | 
			
		||||
                    </li>
 | 
			
		||||
 | 
			
		||||
                    {% for page in paginator.num_pages|pagination_range:page_obj.number %}
 | 
			
		||||
                        {% if page == page_obj.number %}
 | 
			
		||||
                            <li class="paginate_button active" aria-controls="editable" tabindex="0">
 | 
			
		||||
                        {% else %}
 | 
			
		||||
                            <li class="paginate_button" aria-controls="editable" tabindex="0">
 | 
			
		||||
                        {% endif %}
 | 
			
		||||
                                <a class="page" href="?page={{ page }}" title="第{{ page }}页">{{ page }}</a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                    {% endfor %}
 | 
			
		||||
 | 
			
		||||
                    {% if page_obj.has_next %}
 | 
			
		||||
                        <li class="paginate_button next" aria-controls="editable" tabindex="0" id="editable_next">
 | 
			
		||||
                            <a class="page" href="?page={{ page_obj.next_page_number }}">Next</a>
 | 
			
		||||
                        <li class="paginate_button next" aria-controls="editable" tabindex="0" id="next">
 | 
			
		||||
                            <a data-page="next" href="?page={{ page_obj.next_page_number }}">›</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    {% endif %}
 | 
			
		||||
                </ul>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
from django.forms import ModelForm
 | 
			
		||||
from django import forms
 | 
			
		||||
 | 
			
		||||
from .models import User, UserGroup
 | 
			
		||||
from .models import User, UserGroup, Role
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserAddForm(ModelForm):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,9 @@
 | 
			
		|||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
 | 
			
		||||
from django.db.models.signals import post_migrate
 | 
			
		||||
from django.dispatch import receiver
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.contrib.auth.models import AbstractUser, Permission
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +21,9 @@ class Role(AbstractGroup):
 | 
			
		|||
    class Meta:
 | 
			
		||||
        db_table = 'role'
 | 
			
		||||
 | 
			
		||||
    def init(self):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def init(cls):
 | 
			
		||||
        roles = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ from django.db.models import Q
 | 
			
		|||
from django.views.generic.list import ListView
 | 
			
		||||
from django.views.generic.edit import CreateView, DeleteView, UpdateView
 | 
			
		||||
from django.views.generic.detail import DetailView
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
 | 
			
		||||
from .models import User, UserGroup, Role
 | 
			
		||||
from .forms import UserAddForm, UserUpdateForm, UserGroupForm
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +14,7 @@ from .forms import UserAddForm, UserUpdateForm, UserGroupForm
 | 
			
		|||
 | 
			
		||||
class UserListView(ListView):
 | 
			
		||||
    model = User
 | 
			
		||||
    paginate_by = 20
 | 
			
		||||
    paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
 | 
			
		||||
    context_object_name = 'user_list'
 | 
			
		||||
    template_name = 'users/user_list.html'
 | 
			
		||||
    ordering = '-date_joined'
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +40,6 @@ class UserListView(ListView):
 | 
			
		|||
class UserAddView(CreateView):
 | 
			
		||||
    model = User
 | 
			
		||||
    form_class = UserAddForm
 | 
			
		||||
    initial = {'role': Role.objects.get(name='User')}
 | 
			
		||||
    template_name = 'users/user_add.html'
 | 
			
		||||
    success_url = reverse_lazy('users:user-list')
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										33
									
								
								hardcopy.0
								
								
								
								
							
							
						
						
									
										33
									
								
								hardcopy.0
								
								
								
								
							| 
						 | 
				
			
			@ -1,33 +0,0 @@
 | 
			
		|||
     58
 | 
			
		||||
 | 
			
		||||
/root/env2.7/lib/python2.7/site-packages/django/db/models/fields/__init__.pyc in get_prep_value(self, value)
 | 
			
		||||
    944         if value is None:
 | 
			
		||||
    945             return None
 | 
			
		||||
--> 946         return int(value)
 | 
			
		||||
    947
 | 
			
		||||
    948     def contribute_to_class(self, cls, name, **kwargs):
 | 
			
		||||
 | 
			
		||||
TypeError: int() argument must be a string or a number, not 'QuerySet'
 | 
			
		||||
 | 
			
		||||
In [6]: group.user_set.update(users)
 | 
			
		||||
---------------------------------------------------------------------------
 | 
			
		||||
TypeError                                 Traceback (most recent call last)
 | 
			
		||||
<ipython-input-6-94520763e8e7> in <module>()
 | 
			
		||||
----> 1 group.user_set.update(users)
 | 
			
		||||
 | 
			
		||||
/root/env2.7/lib/python2.7/site-packages/django/db/models/manager.pyc in manager_method(self, *args, **kwargs)
 | 
			
		||||
     83         def create_method(name, method):
 | 
			
		||||
     84             def manager_method(self, *args, **kwargs):
 | 
			
		||||
---> 85                 return getattr(self.get_queryset(), name)(*args, **kwargs)
 | 
			
		||||
     86             manager_method.__name__ = method.__name__
 | 
			
		||||
     87             manager_method.__doc__ = method.__doc__
 | 
			
		||||
 | 
			
		||||
TypeError: update() takes exactly 1 argument (2 given)
 | 
			
		||||
 | 
			
		||||
In [7]: users
 | 
			
		||||
Out[7]: <QuerySet [<User: christina86>, <User: tina71>, <User: emily71>, <User: tammy66>, <User: sarah66>, <User: linda75>, <User: ev
 | 
			
		||||
elyn88>, <User: mildred72>, <User: sharon93>, <User: christina88>, <User: heather80>, <User: amy80>, <User: julia81>, <User: sarah89>
 | 
			
		||||
, <User: phillip74>, <User: kimberly74>, <User: ann73>, <User: helen63>, <User: joyce77>, <User: debra67>, '...(remaining elements tr
 | 
			
		||||
uncated)...']>
 | 
			
		||||
 | 
			
		||||
In [8]: group.user_set
 | 
			
		||||
		Loading…
	
		Reference in New Issue