Создание команды загрузки задач. Создание команды загрузки задач. Создание команды загрузки задач.

Создание команды загрузки задач.

Open in new window

Создание пустой команды (main/management/commands/load_tasks.py).

from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):

def handle(self, *args, **options):
    print('Load Tasks')

Установка библиотеки requests

pip install requests

Пытаемся использовать requests.

rez = requests.get('https://google.com')
print(rez.text)

Определим глобальную переменную с ключем API в файле settings.py

API_KEY = '<secret key>'

Импорт этой переменной из любого модуля будет выглядить так:

from djangoprj.settings import API_KEY

Определим ф-цию внутри команды.

def get_tasks(self):
    action = 'get_all_tasks'
    key_str = '%s%s' % (action,API_KEY)
    hash = hashlib.md5(key_str.encode()).hexdigest()
    url = 'https://wezom.worksection.com/api/admin/?action=%s&hash=%s' % (action, hash)
    res = requests.get(url)
    out = json.loads(res.text)
    return out['data']

Используем параметр self, передавая ее в функцию т.к. эта функция определена как метод внутри класса

Тут мы формируем строку согласно документации API где конкатенируем название запроса с секретным ключем.

key_str = '%s%s' % (action,API_KEY)

Кодируем ее в md5 строку.

hash = hashlib.md5(key_str.encode()).hexdigest()

И посылаем запрос на адрес API, куда передаем наш хэш.

url = 'https://wezom.worksection.com/api/admin/?action=%s&hash=%s' % (action, hash)
res = requests.get(url)

Получаем результат в таком формате:

"status": "ok",
"data": [
   {
        "name": "TITLE",
        "page": "/project/PROJECT_ID/TASK_ID/",
        "status": "done",
        "priority": "0..10",
        "user_from": {
            "email": "USER_EMAIL",
            "name": "USER_NAME"
        },
        "user_to": {
            "email": "USER_EMAIL",
            "name": "USER_NAME"
        },
        "date_added": "YYYY-MM-DD HH:II",
        "date_start": "YYYY-MM-DD",
        "date_end": "YYYY-MM-DD",
        "date_closed": "YYYY-MM-DD HH:II",
        "max_time": "50"
        "max_money": "100"
        "tags": "complete"

Чтобы с ним работать необходимо эту json строку преобразовать в питоновский словарь.

out = json.loads(res.text)

теперь можно доставать данные по ключу:

out['data']

Добавим класс модели в файл main/models.py

class WTasks(models.Model):
    name =  models.CharField(max_length=250)
    page = models.CharField(max_length=250)
    status = models.CharField(max_length=250)
    priority = models.CharField(max_length=250)
    user_from = models.CharField(max_length=250)
    user_to = models.CharField(max_length=250)
    date_added = models.CharField(max_length=250)
    date_start = models.CharField(max_length=250)
    date_end = models.CharField(max_length=250)
    date_closed = models.CharField(max_length=250)
    max_time = models.CharField(max_length=250)
    max_money = models.CharField(max_length=250)

Определим функцию для сохранения задач в базу, которой передадим список.

Попутно проверяем пользователя на существование чтоб избежать дублирования при повторных запусках команды.

Полный код комманды:

from django.core.management.base import BaseCommand, CommandError
import requests
from djangoprj.settings import API_KEY
import hashlib
import json

from main.models import WUsers

def save_users(users):
    for u in users:
        print('Saving %s' % u['name'])
        try:
            WUsers.objects.get(email=u['email'])
            print('User %s exists' % u['email'])
        except:
            nu = WUsers()
            nu.name = u['name']
            nu.email = u['email']
            nu.first_name = u['first_name']
            nu.last_name = u['last_name']
            nu.title = u['title']
            nu.avatar = u['avatar']
            nu.company = u['company']
            nu.department = u['department']
            nu.save()

def get_users():
    action = 'get_users'
    key_str = '%s%s' % (action,API_KEY)
    hash = hashlib.md5(key_str.encode()).hexdigest()
    print('hash = %s' % hash)
    url = 'https://wezom.worksection.com/api/admin/?action=%s&hash=%s' % (action, hash)
    res = requests.get(url)
    out = json.loads(res.text)
    return out['data']


class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Load users key is %s' % API_KEY)
        users = get_users()
        save_users(users)

Результат работы (содержимое базы sqlite в файле db.sqlite3)

error template page

Вывод пользователей на страницу.

Во вьюхе (main/views.py) выберем всех пользователей и передадим в шаблон третьим параметром функции render.

from .models import WUsers

def home_page(request):
    users = WUsers.objects.all()
    return render(request,'main.html',{'users': users})

Парсим массив в шаблоне (main/templates/main.html).

<h1>User list</h1>

<ul>
{% for u in users %}
    <li>{{ u.name }}</li>
{% endfor %}
</ul>

user's list page

Other topics