finance logging

remotes/origin/yandex_rebiling
Andrey 8 years ago
parent 68e7aa0257
commit 8bc648feaa
  1. 42
      access/management/commands/set_tokens.py
  2. 5
      access/serializers.py
  3. 22
      access/views.py
  4. 1
      finance/models.py
  5. 20
      progress/migrations/0010_progress_exp_date.py
  6. 1
      progress/models.py
  7. 1
      progress/urls.py
  8. 69
      progress/views.py

@ -0,0 +1,42 @@
import csv
import jwt
from django.conf import settings
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Добавляет 1 или нескольких юзеров в указанные группы'
def add_arguments(self, parser):
parser.add_argument(
'--from',
type=str,
dest='from',
help='Файл подгрузки данных'
)
parser.add_argument(
'--to',
type=str,
dest='to',
help='Файл выгрузки'
)
def handle(self, *args, **options):
from_path = options['from']
to_path = options['to']
with open(from_path) as f:
with open(to_path, 'w') as out_f:
fw = csv.writer(out_f)
fr = csv.reader(f)
for row in fr:
email = row[0]
course_token = row[1]
period = row[2]
payload = {
'period': period,
'course_token': course_token,
'email': email.lower(),
}
token = jwt.encode(payload, settings.COURSE_PROGRESS_SECRET_KEY, algorithm='HS256').decode("utf-8")
url = "https://go.skillbox.ru/api/v1/progress/progress_token/?token=%s" % str(token)
fw.writerow([email.lower(), url])

@ -4,7 +4,7 @@ from rest_framework import serializers
from access.models.other import Account from access.models.other import Account
from achievements.serialers import DiplomaSerializer, AchievementsSerializer from achievements.serialers import DiplomaSerializer, AchievementsSerializer
from progress.serializers import SecureProgressSerializer, SupportProgressSerializer from progress.serializers import SecureProgressSerializer, SupportProgressSerializer
from django.utils import timezone
class AccountSerializer(serializers.ModelSerializer): class AccountSerializer(serializers.ModelSerializer):
gender = serializers.SerializerMethodField() gender = serializers.SerializerMethodField()
@ -53,7 +53,8 @@ class UserSelfSerializer(serializers.ModelSerializer):
@staticmethod @staticmethod
def get_progresses(self): def get_progresses(self):
return [SecureProgressSerializer(i).data for i in self.progress_set.filter(is_freeze=False)] return [SecureProgressSerializer(i).data for i in
self.progress_set.filter(is_freeze=False).exclude(exp_date__lt=timezone.now())]
class UserProfileSerializer(serializers.ModelSerializer): class UserProfileSerializer(serializers.ModelSerializer):

@ -252,21 +252,15 @@ class LoginView(APIView):
def post(request): def post(request):
password = request.JSON.get('password') password = request.JSON.get('password')
email = request.JSON.get('email').lower() email = request.JSON.get('email').lower()
user = None
try:
user = get_user_model().objects.get(email=email)
except get_user_model().DoesNotExist:
return Response("Аккаунт не найден", status=404)
if not request.user.is_authenticated(): if not request.user.is_authenticated():
if not password == settings.MASTER_PASSWORD: if not password == settings.MASTER_PASSWORD and not auth.authenticate(email=email, password=password):
try: return Response("Неверный пароль", status=403)
get_user_model().objects.get(email=email)
user = auth.authenticate(email=email, password=request.JSON.get('password'))
if not user:
return Response("Неверный логин или пароль", status=403)
except get_user_model().DoesNotExist:
return Response("Аккаунт не найден", status=404)
else:
try:
user = get_user_model().objects.get(email=email)
except get_user_model().DoesNotExist:
return Response("Аккаунт не найден", status=404)
try: try:
auth.login(request, user) auth.login(request, user)

@ -164,6 +164,7 @@ class InvoiceRebilling(Invoice):
rebilling_on = models.BooleanField(verbose_name='Повторять платеж', default=False, editable=False) rebilling_on = models.BooleanField(verbose_name='Повторять платеж', default=False, editable=False)
def create_child_pays(self, count): def create_child_pays(self, count):
# TODO Заменить expected_date
for idx in range(int(count)-1): for idx in range(int(count)-1):
InvoiceRebilling.objects.create( InvoiceRebilling.objects.create(
bill=self.bill, bill=self.bill,

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-04-16 18:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('progress', '0009_progress_is_freeze'),
]
operations = [
migrations.AddField(
model_name='progress',
name='exp_date',
field=models.DateTimeField(blank=True, null=True, verbose_name='Дата сгорания'),
),
]

@ -14,6 +14,7 @@ class Progress(models.Model):
is_finish = models.BooleanField(verbose_name="Окончен ли курс", default=False) is_finish = models.BooleanField(verbose_name="Окончен ли курс", default=False)
is_freeze = models.BooleanField(verbose_name="Прохождение было преостановленно", default=False) is_freeze = models.BooleanField(verbose_name="Прохождение было преостановленно", default=False)
only_watch = models.BooleanField(verbose_name="Только просмотр", default=False) only_watch = models.BooleanField(verbose_name="Только просмотр", default=False)
exp_date = models.DateTimeField(verbose_name='Дата сгорания', blank=True, null=True)
def progress_status(self, sorted_token_list): def progress_status(self, sorted_token_list):
""" """

@ -11,4 +11,5 @@ urlpatterns = [
url(r'teacher/$', views.TeacherUpdateProgress.as_view()), url(r'teacher/$', views.TeacherUpdateProgress.as_view()),
url(r'set-progress/$', views.SetProgress.as_view()), url(r'set-progress/$', views.SetProgress.as_view()),
url(r'get_hw_pay/$', views.get_teachers_pay), url(r'get_hw_pay/$', views.get_teachers_pay),
url(r'progress_token/$', views.ProgressToken.as_view()),
] ]

@ -1,6 +1,11 @@
import csv import csv
import datetime import datetime
from django.db import IntegrityError
from django.shortcuts import redirect
from dateutil.relativedelta import relativedelta
from django.contrib import auth
from django.utils import timezone
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
@ -11,6 +16,8 @@ from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from django.db.models import Q from django.db.models import Q
import jwt
from django.conf import settings
from access.serializers import UserProgressSearchSerializer from access.serializers import UserProgressSearchSerializer
from courses.models import Course, Lesson from courses.models import Course, Lesson
@ -463,3 +470,65 @@ def get_teachers_pay(request):
]) ])
return response return response
class ProgressToken(APIView):
renderer_classes = (JSONRenderer,)
@staticmethod
def post(request):
email = request.JSON.get("email", None)
course_token = request.JSON.get("course_token", None)
period = request.JSON.get("period", None)
if email is None or course_token is None or period is None:
return Response("bad request", 400)
if request.user.is_authenticated() and request.user.is_staff:
payload = {
'period': period,
'course_token': course_token,
'email': email.lower(),
}
jwt.encode(payload, settings.COURSE_PROGRESS_SECRET_KEY, algorithm='HS256')
return Response("доступно только персоналу", status=403)
@staticmethod
def get(request):
token = request.GET.get('token', None)
if token is None:
return Response("bad request", 400)
payload = jwt.decode(token, settings.COURSE_PROGRESS_SECRET_KEY, algorithms=['HS256'])
try:
user = get_user_model().objects.get(email=payload['email'].lower())
except get_user_model().DoesNotExist:
user = get_user_model().objects.create_student(email=payload['email'].lower())
user.is_active = True
user.save()
try:
course = Course.objects.get(token=payload['course_token'])
except get_user_model().DoesNotExist:
return Response("Course doesn't exist", status=404)
teacher = get_user_model().objects.get(out_key=course.get_teacher())
try:
p = Progress.objects.create(
user=user,
course_token=payload['course_token'],
teacher=teacher,
exp_date=timezone.now() + relativedelta(days=int(payload['period'])),
)
ProgressLesson.objects.create(
progress=p,
lesson_token=course.get_first_lesson().token,
checker=p.user,
)
except IntegrityError:
pass
auth.login(request, user)
return redirect('/')

Loading…
Cancel
Save