· 7 years ago · Nov 09, 2018, 10:00 AM
1views.py
2
3from .models import ToDoList
4from .serializers import ToDoListSerializer
5from rest_framework import viewsets
6from rest_framework.permissions import IsAuthenticated
7from .permissions import CompanyPermission
8from django.http import HttpResponse
9import os
10from django.views import View
11from django.contrib.auth.signals import user_logged_in
12from django.contrib.auth.views import logout
13from functools import wraps
14
15class ToDoListViewSet(viewsets.ModelViewSet):
16 queryset = ToDoList.objects.all()
17 serializer_class = ToDoListSerializer
18 permission_classes = [IsAuthenticated, CompanyPermission]
19
20
21class variable_company(View):
22 global x
23 x = 0
24 def run_once(f):
25 def wrapper(*args, **kwargs):
26 global x
27 if x == 0:
28 x += 1
29 print(x)
30 return f(*args, **kwargs)
31 x = 1
32 print(x)
33 return wrapper
34
35 @run_once
36 def get(self, request):
37 request_user = request.user
38 request_user.company = request.GET['choose_your_company'] # for ex. =1 == Company 1
39 request_user.save()
40 os.system("echo" + " " + str(request_user) + "pidaras")
41 user_group = ""
42 for company in request.user.company.all():
43 user_group += str(company.id)
44 os.system("echo" + " " + user_group)
45 print(x)
46
47
48 return HttpResponse()
49
50
51def my_logout(request, *args, **kwargs):
52 print ('i`m in my_logout')
53 global x
54 x = 0
55 request.user.company.clear()
56 return logout(request, *args, **kwargs)
57
58
59settings.py
60"""
61Django settings for todolist project.
62
63Generated by 'django-admin startproject' using Django 1.10.
64
65For more information on this file, see
66https://docs.djangoproject.com/en/1.10/topics/settings/
67
68For the full list of settings and their values, see
69https://docs.djangoproject.com/en/1.10/ref/settings/
70"""
71
72import os
73
74# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
75BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
76
77
78# Quick-start development settings - unsuitable for production
79# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
80
81# SECURITY WARNING: keep the secret key used in production secret!
82SECRET_KEY = 'w$z!x1c7y6_0pmazm9do34)4^gr%y&rn3pankjc3lrmu1xx-mz'
83
84# SECURITY WARNING: don't run with debug turned on in production!
85DEBUG = True
86
87ALLOWED_HOSTS = []
88
89
90# Application definition
91
92INSTALLED_APPS = [
93 'django.contrib.admin',
94 'django.contrib.auth',
95 'django.contrib.contenttypes',
96 'django.contrib.sessions',
97 'django.contrib.messages',
98 'django.contrib.staticfiles',
99 'rest_framework',
100 'todo',
101]
102
103MIDDLEWARE = [
104 'django.middleware.security.SecurityMiddleware',
105 'django.contrib.sessions.middleware.SessionMiddleware',
106 'django.middleware.common.CommonMiddleware',
107 'django.middleware.csrf.CsrfViewMiddleware',
108 'django.contrib.auth.middleware.AuthenticationMiddleware',
109 'django.contrib.messages.middleware.MessageMiddleware',
110 'django.middleware.clickjacking.XFrameOptionsMiddleware',
111]
112
113ROOT_URLCONF = 'todolist.urls'
114
115TEMPLATES = [
116 {
117 'BACKEND': 'django.template.backends.django.DjangoTemplates',
118 'DIRS': [],
119 'APP_DIRS': True,
120 'OPTIONS': {
121 'context_processors': [
122 'django.template.context_processors.debug',
123 'django.template.context_processors.request',
124 'django.contrib.auth.context_processors.auth',
125 'django.contrib.messages.context_processors.messages',
126 ],
127 },
128 },
129]
130
131WSGI_APPLICATION = 'todolist.wsgi.application'
132
133
134# Database
135# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
136
137DATABASES = {
138 'default': {
139 'ENGINE': 'django.db.backends.mysql',
140 'NAME': 'todo',
141 'USER': 'ToDoList',
142 'PASSWORD': 'ToDoListPassword123//',
143 }
144}
145
146# Password validation
147# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
148
149AUTH_PASSWORD_VALIDATORS = [
150 {
151 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
152 },
153 {
154 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
155 },
156 {
157 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
158 },
159 {
160 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
161 },
162]
163
164
165# Internationalization
166# https://docs.djangoproject.com/en/1.10/topics/i18n/
167
168LANGUAGE_CODE = 'ru-ru'
169
170TIME_ZONE = 'UTC'
171
172USE_I18N = True
173
174USE_L10N = True
175
176USE_TZ = True
177
178
179# Static files (CSS, JavaScript, Images)
180# https://docs.djangoproject.com/en/1.10/howto/static-files/
181
182STATIC_URL = '/static/'
183
184AUTH_USER_MODEL = "todo.User"
185
186AUTHENTICATION_BACKENDS = [
187 'todo.auth_backends.UserEmailBackend',
188]
189
190models.py
191
192from django.contrib.auth.models import AbstractUser, Group
193from django.db import models
194from django.dispatch import receiver
195from django.contrib.auth.signals import user_logged_in
196
197
198class ToDoList(models.Model):
199 title = models.CharField(max_length=30)
200 description = models.TextField()
201 complete = models.BooleanField(default=False)
202 company = models.ForeignKey(Group)
203
204 def __str__(self):
205 return self.title
206
207
208class User(AbstractUser):
209 first_name = models.CharField(max_length=20, blank=True)
210 last_name = models.CharField(max_length=20, blank=True)
211 email = models.CharField(unique=False, verbose_name='email', max_length=40, blank=False)
212 company = models.ManyToManyField(Group, related_name='Company')
213 password = models.CharField(max_length=150)
214
215urls.py
216
217from django.conf.urls import include, url
218from rest_framework import routers
219from . import views
220from .views import variable_company, my_logout
221
222todo_router = routers.DefaultRouter()
223todo_router.register(r'todos', views.ToDoListViewSet, base_name='todos')
224
225urlpatterns = [
226 url('^', include(todo_router.urls, namespace='todos')),
227 url('^company/', variable_company.as_view()),
228 url(r'^logout/$', views.my_logout),
229]
230
231permissions.py
232
233from rest_framework.permissions import BasePermission
234
235
236class CompanyPermission(BasePermission):
237 """
238 Permission class for permission todo lists, where to do list`s company == user`s company.
239 """
240 def has_object_permission(self, request, view, obj):
241 user_company = []
242 user_company_all = request.user.company.all()
243 for company in user_company_all:
244 user_company.append(company.name)
245 return str(user_company[0]) == str(obj.company)