From a3c5c7793faf75c30b4b1771f2f21662e0232e53 Mon Sep 17 00:00:00 2001 From: Farid Date: Sun, 24 Sep 2023 17:52:33 +0300 Subject: [PATCH] First Task --- R4C/__init__.py | 0 R4C/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 167 bytes R4C/__pycache__/settings.cpython-311.pyc | Bin 0 -> 2672 bytes R4C/__pycache__/urls.cpython-311.pyc | Bin 0 -> 1178 bytes R4C/__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 680 bytes R4C/asgi.py | 16 +++ R4C/settings.py | 123 ++++++++++++++++++ R4C/urls.py | 22 ++++ R4C/wsgi.py | 16 +++ README.md | 35 ++++- customers/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 173 bytes customers/__pycache__/admin.cpython-311.pyc | Bin 0 -> 228 bytes customers/__pycache__/apps.cpython-311.pyc | Bin 0 -> 489 bytes customers/__pycache__/models.cpython-311.pyc | Bin 0 -> 601 bytes customers/admin.py | 3 + customers/apps.py | 5 + customers/migrations/0001_initial.py | 21 +++ customers/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 943 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 184 bytes customers/models.py | 5 + customers/tests.py | 3 + customers/views.py | 3 + db.sqlite3 | Bin 0 -> 147456 bytes manage.py | 21 +++ orders/__init__.py | 0 orders/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 170 bytes orders/__pycache__/admin.cpython-311.pyc | Bin 0 -> 225 bytes orders/__pycache__/apps.cpython-311.pyc | Bin 0 -> 480 bytes orders/__pycache__/models.cpython-311.pyc | Bin 0 -> 787 bytes orders/admin.py | 3 + orders/apps.py | 5 + orders/migrations/0001_initial.py | 24 ++++ orders/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1237 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 181 bytes orders/models.py | 8 ++ orders/tests.py | 3 + orders/views.py | 3 + robots/__init__.py | 0 robots/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 170 bytes robots/__pycache__/admin.cpython-311.pyc | Bin 0 -> 225 bytes robots/__pycache__/apps.cpython-311.pyc | Bin 0 -> 480 bytes robots/__pycache__/models.cpython-311.pyc | Bin 0 -> 828 bytes robots/__pycache__/urls.cpython-311.pyc | Bin 0 -> 396 bytes robots/__pycache__/views.cpython-311.pyc | Bin 0 -> 1636 bytes robots/admin.py | 3 + robots/apps.py | 5 + robots/migrations/0001_initial.py | 24 ++++ robots/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1157 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 181 bytes robots/models.py | 8 ++ robots/tests.py | 3 + robots/urls.py | 7 + robots/views.py | 23 ++++ tasks.md | 50 +++++++ 58 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 R4C/__init__.py create mode 100644 R4C/__pycache__/__init__.cpython-311.pyc create mode 100644 R4C/__pycache__/settings.cpython-311.pyc create mode 100644 R4C/__pycache__/urls.cpython-311.pyc create mode 100644 R4C/__pycache__/wsgi.cpython-311.pyc create mode 100644 R4C/asgi.py create mode 100644 R4C/settings.py create mode 100644 R4C/urls.py create mode 100644 R4C/wsgi.py create mode 100644 customers/__init__.py create mode 100644 customers/__pycache__/__init__.cpython-311.pyc create mode 100644 customers/__pycache__/admin.cpython-311.pyc create mode 100644 customers/__pycache__/apps.cpython-311.pyc create mode 100644 customers/__pycache__/models.cpython-311.pyc create mode 100644 customers/admin.py create mode 100644 customers/apps.py create mode 100644 customers/migrations/0001_initial.py create mode 100644 customers/migrations/__init__.py create mode 100644 customers/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 customers/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 customers/models.py create mode 100644 customers/tests.py create mode 100644 customers/views.py create mode 100644 db.sqlite3 create mode 100644 manage.py create mode 100644 orders/__init__.py create mode 100644 orders/__pycache__/__init__.cpython-311.pyc create mode 100644 orders/__pycache__/admin.cpython-311.pyc create mode 100644 orders/__pycache__/apps.cpython-311.pyc create mode 100644 orders/__pycache__/models.cpython-311.pyc create mode 100644 orders/admin.py create mode 100644 orders/apps.py create mode 100644 orders/migrations/0001_initial.py create mode 100644 orders/migrations/__init__.py create mode 100644 orders/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 orders/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 orders/models.py create mode 100644 orders/tests.py create mode 100644 orders/views.py create mode 100644 robots/__init__.py create mode 100644 robots/__pycache__/__init__.cpython-311.pyc create mode 100644 robots/__pycache__/admin.cpython-311.pyc create mode 100644 robots/__pycache__/apps.cpython-311.pyc create mode 100644 robots/__pycache__/models.cpython-311.pyc create mode 100644 robots/__pycache__/urls.cpython-311.pyc create mode 100644 robots/__pycache__/views.cpython-311.pyc create mode 100644 robots/admin.py create mode 100644 robots/apps.py create mode 100644 robots/migrations/0001_initial.py create mode 100644 robots/migrations/__init__.py create mode 100644 robots/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 robots/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 robots/models.py create mode 100644 robots/tests.py create mode 100644 robots/urls.py create mode 100644 robots/views.py create mode 100644 tasks.md diff --git a/R4C/__init__.py b/R4C/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/R4C/__pycache__/__init__.cpython-311.pyc b/R4C/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4726255fbf8ea347db03e1ca77aea060d57e5ab6 GIT binary patch literal 167 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 literal 0 HcmV?d00001 diff --git a/R4C/asgi.py b/R4C/asgi.py new file mode 100644 index 0000000..38d534a --- /dev/null +++ b/R4C/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for R4C project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'R4C.settings') + +application = get_asgi_application() diff --git a/R4C/settings.py b/R4C/settings.py new file mode 100644 index 0000000..d284f79 --- /dev/null +++ b/R4C/settings.py @@ -0,0 +1,123 @@ +""" +Django settings for R4C project. + +Generated by 'django-admin startproject' using Django 3.0.9. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.0/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'mztx@x_-=gfhc9xs@bm58m&@3pc7##opo14zob!(l2tus05+jo' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'customers', + 'orders', + 'robots' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'R4C.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'R4C.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.0/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/R4C/urls.py b/R4C/urls.py new file mode 100644 index 0000000..2489036 --- /dev/null +++ b/R4C/urls.py @@ -0,0 +1,22 @@ +"""R4C URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path +from django.urls import path, include +urlpatterns = [ + path('admin/', admin.site.urls), + path('robots/',include('robots.urls')), +] diff --git a/R4C/wsgi.py b/R4C/wsgi.py new file mode 100644 index 0000000..385b51e --- /dev/null +++ b/R4C/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for R4C project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'R4C.settings') + +application = get_wsgi_application() diff --git a/README.md b/README.md index c037f11..eec0642 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,33 @@ -# Robots -Это заготовка для сервиса, который ведет учет произведенных роботов, а также выполняет некие операции связанные с этим процессом. +# R4C - Robots for consumers + +## Небольшая предыстория. +Давным-давно, в далёкой-далёкой галактике, была компания производящая различных +роботов. + +Каждый робот(**Robot**) имел определенную модель выраженную двух-символьной +последовательностью(например R2). Одновременно с этим, модель имела различные +версии(например D2). Напоминает популярный телефон различных моделей(11,12,13...) и его версии +(X,XS,Pro...). Вне компании роботов чаще всего называли по серийному номеру, объединяя модель и версию(например R2-D2). + +Также у компании были покупатели(**Customer**) которые периодически заказывали того или иного робота. + +Когда роботов не было в наличии - заказы покупателей(**Order**) попадали в список ожидания. + +--- +## Что делает данный код? +Это заготовка для сервиса, который ведет учет произведенных роботов,а также +выполняет некие операции связанные с этим процессом. + +Сервис нацелен на удовлетворение потребностей трёх категорий пользователей: +- Технические специалисты компании. Они будут присылать информацию +- Менеджмент компании. Они будут запрашивать информацию +- Клиенты. Им будут отправляться информация +___ + +## Как с этим работать? +- Создать для этого проекта репозиторий на GitHub +- Открыть данный проект в редакторе/среде разработки которую вы используете +- Ознакомиться с задачами в файле tasks.md +- Написать понятный и поддерживаемый код для каждой задачи +- Сделать по 1 отдельному PR с решением для каждой задачи +- Прислать ссылку на своё решение \ No newline at end of file diff --git a/customers/__init__.py b/customers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/customers/__pycache__/__init__.cpython-311.pyc b/customers/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82359d8e4058aafb80d2e30f22a4a7dc69267bd3 GIT binary patch literal 173 zcmZ3^%ge<81X*wRQ$h4&5CH>>P{wCAAY(d13PUi1CZpdMv>NpVa_YH>+?YDH>Ma%ORAOpu9lOmb;)Nq#O!ZG3!YUS>&r pyk0@&FAkgB{FKt1RJ$Tppn)JOi}``X2WCb_#t#fIqKFwN1^|B4D(3(I literal 0 HcmV?d00001 diff --git a/customers/__pycache__/admin.cpython-311.pyc b/customers/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ce45b58ffbd4e629a42eff66cd39110f5c7bbc6 GIT binary patch literal 228 zcmZ3^%ge<81X*wRQ|*EDV-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdAO)I? zw^$QXax?S%G?{MkrDP@MrRVD<=jW9aWhNCd0~M@f_zY6_%huT{CbT%Us5mAqu_!Yo z#w9%1VMD7qAdg_-Kxm<+$C13%Q54InXYJKfo^kKoS3p zWw_Q#u!zJem9ux3fauKb%s21dd2Y4pKs5er%Nx?~+SpK~1gkEAIS3FqfdCyuFyIV? z@c_b<_+$dS(k;j_gmnp>%7->PnAJ|>*p9-XKk~|qTw!Ufb_vWuf`bC679CR`h*((I=O6e$ z3rl~7f`x2r6|jhCWuv=yiJ<7r&Wm||doeUr08P!8VLaCM*#rY}`p(;wb~?a-5e^}# z5ds#>1G7$m*+`n!pyAvGxYm+V&1RWp@SLs*J)*K?HmY$IZ+0noY3m%o1fg`Y4y=9UfQ?g zcX;ns9^A^KTRECDEJg;Mi(W?MSu=<>TP3!h-s>!w?@gx^3feuR?jfy{}-6N!fsIC0T8-CaE3o4z;iy?K-Oo8RmA;b9$tG=7iJ zQ;g6r5ey{Xch2X)*+T>o>>(c;*q00mBMB`cB7H_grnn&wE_J}$zlsc*pYejMBQ^qBiEO6c_DR9-wE?E}WEep77c@+Gj zWo@=>PZUEm9W}g+{SOw<&Ynh?;Mn)J&((O=SL?wK+RG z``GGZn`!PaF~iIVC;9}YeYH+*jJFrl9G+0xuTm9h_rB;|b@F)Z_Q}}Iq%^g=)h$gO zuKbLX4`#9vCZ*<4so5v%GINCwOg(xqfgVkJaHqvHK8;A1Qhd kCY3S9se*7NL65F~sWO6<6kRvFdUy1}nK-!k&uP~8FA)U%82|tP literal 0 HcmV?d00001 diff --git a/customers/migrations/__pycache__/__init__.cpython-311.pyc b/customers/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dff0cc402b3bed1cb22dd53a45fb4bf6986fd967 GIT binary patch literal 184 zcmZ3^%ge<81X*wRQ$h4&5CH>>P{wCAAY(d13PUi1CZpdMv>NpVa_YH>+?YDH>Ma%ORAOpu9lOmb;)Nq#O!ZEj|IQDRAE zeqM1*e0*kJW=VX!UP0wA4x8Nkl+v73yCPPg*&y4C`GLd-W=2NF4-7D(h#4pb0O~d` AivR!s literal 0 HcmV?d00001 diff --git a/customers/models.py b/customers/models.py new file mode 100644 index 0000000..9c2e650 --- /dev/null +++ b/customers/models.py @@ -0,0 +1,5 @@ +from django.db import models + + +class Customer(models.Model): + email = models.CharField(max_length=255,blank=False, null=False) diff --git a/customers/tests.py b/customers/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/customers/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/customers/views.py b/customers/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/customers/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..47cd601fc22a8b8c1d4e6446864a2ba5f75a6d88 GIT binary patch literal 147456 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 literal 0 HcmV?d00001 diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..5c81f95 --- /dev/null +++ b/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'R4C.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/orders/__init__.py b/orders/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/orders/__pycache__/__init__.cpython-311.pyc b/orders/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f75ad729bfc0b88aae2eaca39bf823d17d2a760b GIT binary patch literal 170 zcmZ3^%ge<81X*wRQ$h4&5CH>>P{wCAAY(d13PUi1CZpdMv>NpVa_YH>+?YDH>Ma%ORAOpu9lOny-cNMU?@W?p7Ve7s&k mz) zj;rTNNTsvdxEQ9a*L30%=Yi)-&f_xYekf)WgR7k1&b&z;ag2Y4wVASMcMjRLre18| zsgYpaus`!M56ZQuRk#vWtTb%f>J-igYWwS7rsNaR}%JnfZ^dDvf#9sH$$W zdi3v#7<<7mY?&6ytR-twF(^%}5!#fFvY#KTI#II?eMTm+5pf0kufI=HMBGc@uX${L Ln%A#?Lg}z?6xVV* literal 0 HcmV?d00001 diff --git a/orders/__pycache__/models.cpython-311.pyc b/orders/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c61f2b7e70207efe7484e162d1539a6044efc97 GIT binary patch literal 787 zcmZ`$F>ljA6uz_LG_hJ4$pshyBi;Cdg-MjDk?%n&|=l2T>CXhDxZjm2y z|E7Y{j2Sp-O0Wkoz>tCndJrnCQ7zIv9Rdy92Uvd%aD~7@rA*$}0r(_WVV;4Fb>LKw zRp>xbjS@^Km#F4uJWV3Pdb6wfc2>G8!#zNN2Qlz84G{fL31Y~oTBaSqeNC2>t1xda zzg;V1tYIDN2bI5w)eB<6c)~DYl2AQ~k>o~Fa;#Xi99@`Eu#G5*`{{--x-^Jiib|YO z+Hp)#Lnsa+f{-u~l3is~;dz9%vVayROvxb3R>DZwj~|g8rc@Gh?&`X`+Po)fy_p1} z?rsFE6%vZYJWIMsia23mKtF;L)yCz(VXdlU^2)IOYB`!c#=HrHmmb z{?qHOpQwJgUkKgU++j+o+$q5CN;fHV%6u+|*Cw9{|seph`fJmq%LW)|6r3g`~lp;O~0t!fxCCkZOgF|A6I|osw z4h)QJFfx^|4vY*8{0Xk)p}MIO6B2__nV5KI*8v1)-}CRid*^%a_ujo8A2$$;?zc($ zPC@94RML^%2YX8ZULb-9?x8+z;=a;Uu+){F+RP~E5+dqTL^2e2(>-WYMd&@uWHhrx zxs7VsuTrfk!st64X8Vrka-sD-LVNsrd*3(y#8Cm-6Chq7ikg_9rb2L2B}xa&Q)#xV zrCW$fq$StQk1UvAk|o+!ZZiXsz)Z%PLh`Yvo?3{$Wo%;bfjROSi+$245FP6l($#Km zgvLi`B1NRIHNFW@C$cvfp-djZANXM5-~PlPTywh)&sgObWRy;a-L98ctlyt zTYo6r{_(Pepn&>Qz{mOx|KW7O%mS0P`GbZxie35B#oJ`N8$OXM1hw;PK~7lq*s z=zh1oMSHR;Kd&{;nsp0b90q)-=dExYdf5px6U+7PcqNV-z{tY zS(*A^oyk6og=`J}2E@kb*`1i$xD;tfpN>@JfVOchGLU}!nGxoX?UWAhmJSBxndgtf z^2~?T&wg;v3?6tvd9Ym`gylg{e7I9O9#rRE9SW;+A8!WLh3)D>SX~H;7j{ZVgG&A7 z-LO*sc<9rSaQ<>Qe=D4C1{M!0{&vL=D}GQMM!C#^i71=XjqeD=4=Ey5pVBt2$cN3O zq1QB_Cp6YcD=tOC{*jTfo?O&=N-(RYd)c%^@vlw+`k6nM6#hIr4XV6XyaggsF~&dz jt_A4SzwZt@5u|UVm9Q3}f5menES~%>7k>O_HICsIx4u({ literal 0 HcmV?d00001 diff --git a/orders/migrations/__pycache__/__init__.cpython-311.pyc b/orders/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d7c048760fe7b9423ec7d433bc57db00e6d57fe GIT binary patch literal 181 zcmZ3^%ge<81X*wRQ$h4&5CH>>P{wCAAY(d13PUi1CZpdMv>NpVa_YH>+?YDH>Ma%ORAOpu9lOny-cNMUYfdQoCYW`16A xOniK1US>&ryk0@&FAkgB{FKt1RJ$Tppur%ki}``X2WCb_#t#fIqKFwN1^_mLE;0ZB literal 0 HcmV?d00001 diff --git a/orders/models.py b/orders/models.py new file mode 100644 index 0000000..30b6bb4 --- /dev/null +++ b/orders/models.py @@ -0,0 +1,8 @@ +from django.db import models + +from customers.models import Customer + + +class Order(models.Model): + customer = models.ForeignKey(Customer,on_delete=models.CASCADE) + robot_serial = models.CharField(max_length=5,blank=False, null=False) diff --git a/orders/tests.py b/orders/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/orders/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/orders/views.py b/orders/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/orders/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/robots/__init__.py b/robots/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/robots/__pycache__/__init__.cpython-311.pyc b/robots/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf2b0cb211418feb5d9e556edf204035dc919314 GIT binary patch literal 170 zcmZ3^%ge<81le!+Q$h4&5CH>>P{wCAAY(d13PUi1CZpdMv>NpVa_YH>+?YDH>Ma%ORAOpu9lOi_MPK2Rb)J~J<~BtBlR npz;@oO>TZlX-=wL5i8I%kbTAcK;i>4BO~Jn1{hJq3={(Z-1RA$ literal 0 HcmV?d00001 diff --git a/robots/__pycache__/admin.cpython-311.pyc b/robots/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddcde26504aa16408a3f3dc7d997651c9ddc7c5e GIT binary patch literal 225 zcmZ3^%ge<81le!+Q|*EDV-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdAO)I? zw^$QXax?S%G?{MkrDP@MrRVD<=jW9aWhNCd0~M@f_zY6_%gWg*CbT%Us5mAqu_!Yo z#w98k*nlbkb__ce literal 0 HcmV?d00001 diff --git a/robots/__pycache__/apps.cpython-311.pyc b/robots/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dab902229224f373ea95e2a8ebc0a0302b0a87a GIT binary patch literal 480 zcmZuty-EW?5T3cagqR-!#uuUTUbHV%6o2QBe91OKB1lMSB`Ps^=>!rY6^rw+&<>?xh%8x7?%KNbM>!{`Y#A6b zu=gK8C8!J;^JgTIhv-(ONDM(`>cpMhM51)yo$vX*d%yR2_f^+R!0Gho15!r-KZLR( z^;Wok$%PBRfRPUYY9j;^GyzMW0LuiONGpd+8Q_ZVjM_3*-h!zvglZy|3nEPXxO;0( zf9n)qxOxEu+6Y5il7Pr3$_j`Pmaz0)z7t-(gHrBA<^BtmPf>++Mv+gwVDLTdJ9o{!<1PmaL*l|gh#z&rgnTcJY`DQ_x*+NG$ks6(jsSjW{DLXCv*ei zIIQG2d>(yY$eQE4@4J3xp<;lnXdSz>;SnFRTui9v`b%$q)p}*OxNB@5y41sVE$a3I682*IfW$qAoDyq(3$4Gozju^+9uPYzf2Gs61{>jq1#(CPsD86pNNuCG43B zE8-J3Jc_n)CmWBtE8bF8<|6@2(T}-wQ`pJo`kFrBDu2@u?{c=35khmQO#l9tIR))3 T;a@gve17vwod3SZn5O#!u3yT# literal 0 HcmV?d00001 diff --git a/robots/__pycache__/urls.cpython-311.pyc b/robots/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed5f9033ad58d589092446f33c17de006f4347de GIT binary patch literal 396 zcmY*TJxc>Y5S_ifJ7Z#^U}2L#5QGH8MiC1ySf=o!2@B!Oj`6~Mv3sY{Dy5~J{sKkx z$DEKtt`e-$1=6K*H!(%t&g{H-FmL9qTrPq_TG+xDReyD}g!NCRr;0oS2TptlNShGg z2B*Fe&^9Gt01|E@?VHO%ZhhLX6yQVU0zJ~U_}V$t3S%wQNN&b%ax*52#=7_Vz7%>z4np55Y|TqbR^ADUP`<-d zNiaKb4%wwdA=$MnJkFX?Hw`dMB)dSFbZ~&8>q%s1`wpA$l}wx0 z{hM$0$8fj_!RQP`$c-fHizLd}7eTI@(Q>w=+ zhCk)UD)t*%K9CAXh^SawM4Mn^t7aLcf>;?t{ekB~(=WMxN=!^BaLq|(nWKaiERzwC zLm5V=C&_h^FW4i`r3zdfwWcgPBc$5!0|N=5!_PqbwY-KFP_DKHfnW8Kq06?wR7b9s zpupDko3MYYZuuM84%YApEy>domKOuqci}$?HSS_DJ9NAYD_G4+*#AJ=1dm&FuVct= zK1SuV8ov>!aVNibWgO_ND?kc1NKMDm1K%cOvsKUNrqmEk2sdY?#&{u;#(2XJZ_EGV z?T?JO%H>OA;|--3jt1a8j03qReS{?FmIZVra8p{4?#grMQ?v#>vmC?-&RiP#3HAG2 zIq{zByGrI=1?#rXgpGK-bad|gx%4NDP?nz7X%?q1Seas;m^Mp~6K0D(pqVTq>CwUS zX)2n4rRTEb8cP)BkAg!p#3a`XbofS(w>Ak)Rj{(AoftB#jBc>uL>&?ahpZ3Ct7qsL zDk0vMgt;-WGO*se@_t1+Ne=-k;#Tt(CWfocL5x|;bhQj6x=paF5=t#v90VBup6~EK z_^wlON`iCl@JG(Kd?(HyI$!Z!zFiZy`7iuYMaZr|&xxDBY~3z0+6H!LOpsGRTrE!+ z(`QKWbz%Pp=Qe-Lcbp~Iy&DH%m;VM(3K=*21omgDdE&hNWZXDpMAocYV5HP(?%|y42OIsT|4J%=K5Y zhq`E#d|8Aea#gSNv;}b0Q~iKO#HN|t3)_VIBt($Az`;pl4 zjrG3!XPrpjUZihHdFe;d*vSLoXD)*1v?cd|Mv{Axt z+O_^Uf9FHqb+O`w2a@}tj`a@y#$|r`W1hOgLlaJDVlOnol?mDkx%4-=QJmAw87skN zEox_qHlw1!-B49MYug2{oNiZDQ)yyMG8WZsi?W3H?NJprQE{>1Y((2Jul!!+sJO76 zJFmJ&fgwN?4KhsMh6VBeVz+=C_#{axqc?fuETdlDILl~|H_kE&mAt2nI(g%KDm5R- X5ouC7K!U#TAvwJG+DTPq!He%-GT_I+ literal 0 HcmV?d00001 diff --git a/robots/admin.py b/robots/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/robots/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/robots/apps.py b/robots/apps.py new file mode 100644 index 0000000..bb0b6fe --- /dev/null +++ b/robots/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class RobotsConfig(AppConfig): + name = 'robots' diff --git a/robots/migrations/0001_initial.py b/robots/migrations/0001_initial.py new file mode 100644 index 0000000..a370215 --- /dev/null +++ b/robots/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.9 on 2023-01-30 06:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Robot', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('serial', models.CharField(max_length=5)), + ('model', models.CharField(max_length=2)), + ('version', models.CharField(max_length=2)), + ('created', models.DateTimeField()), + ], + ), + ] diff --git a/robots/migrations/__init__.py b/robots/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/robots/migrations/__pycache__/0001_initial.cpython-311.pyc b/robots/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aecc9d52d386ecd278d2503721b48481966478c9 GIT binary patch literal 1157 zcma)5%}*0S6rb6)+ipLg5KOggG=5@%kc!68N=ys{qCpObnlzhimd;QX+HToh2zctj zgGb^8{(>3<2aX<%f5A4{1DO+vClU{faN^{f-4+w!;G53d_vZcH%=_w>L?ViSR)6)< z&jLa}xzeRjM>w4TVFwXJa23^X3D<;@fRTV^5D`8i5}&rd>u|OtRM;Pi>)Ap0o$h~frLGz)IA}QeW`^31N#CK{Rb1f0u%oaOv1x-b3rY5 zV6XcOS`sRu{hk&Sdk?lx6sIjP^q%0%CA%-fm6&;oT+snUAIT4o`y z1;;!N76vC18pFb!>!Dpi|AHlrR*5;6i?fL0-Ki)nswm*RUZo(%6=iK*t#UAEVXdxN z5DAMD+Msnp>t&6a2A>HQoAg3|%{y=K_Au!MWHikmVAABWYWQMe3KCq==h!v|}2rqIq5oJ_$^7Qxw05A8m1(nANT zogQze$DQ=Joh%&orS0sqKhuG?WmKycft*4S6IDw{{VHEF!2BY literal 0 HcmV?d00001 diff --git a/robots/migrations/__pycache__/__init__.cpython-311.pyc b/robots/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..241d6c7e57fd7536f4f6071559f1d2bce32e65b8 GIT binary patch literal 181 zcmZ3^%ge<81le!+Q$h4&5CH>>P{wCAAY(d13PUi1CZpdMv>NpVa_YH>+?YDH>Ma%ORAOpu9lOi_MPK2RbzGrcIWBr`v+ yI3_+mGcU6wK3=b&@)w6qZhlH>PO4oIE6`w&)y4ck;sY}yBjX1K7*WIw6axS`>n=S2 literal 0 HcmV?d00001 diff --git a/robots/models.py b/robots/models.py new file mode 100644 index 0000000..fbc4658 --- /dev/null +++ b/robots/models.py @@ -0,0 +1,8 @@ +from django.db import models + + +class Robot(models.Model): + serial = models.CharField(max_length=5, blank=False, null=False) + model = models.CharField(max_length=2, blank=False, null=False) + version = models.CharField(max_length=2, blank=False, null=False) + created = models.DateTimeField(blank=False, null=False) diff --git a/robots/tests.py b/robots/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/robots/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/robots/urls.py b/robots/urls.py new file mode 100644 index 0000000..0b2792a --- /dev/null +++ b/robots/urls.py @@ -0,0 +1,7 @@ +# urls.py +from django.urls import path +from . import views + +urlpatterns = [ + path('api/robot/', views.robot_endpoint, name='robot_endpoint'), +] \ No newline at end of file diff --git a/robots/views.py b/robots/views.py new file mode 100644 index 0000000..f82a7f9 --- /dev/null +++ b/robots/views.py @@ -0,0 +1,23 @@ +from django.shortcuts import render +from django.http import JsonResponse +from django.views.decorators.csrf import csrf_exempt +import json +from .models import Robot + +@csrf_exempt +def robot_endpoint(request): + if request.method == 'POST': + data = json.loads(request.body) + + # Валидация данных + if not all(key in data for key in ['model', 'version', 'created']): + return JsonResponse({"error": "Некорректные входные данные"}, status=400) + + # Создание записи в базе данных + robot = Robot.objects.create( + model=data['model'], + version=data['version'], + created=data['created'] + ) + return JsonResponse({"message": "Успешно создано!"}) + return JsonResponse({"error": "Метод не поддерживается"}, status=405) diff --git a/tasks.md b/tasks.md new file mode 100644 index 0000000..8097cf8 --- /dev/null +++ b/tasks.md @@ -0,0 +1,50 @@ +# Task 1. От технического специалиста компании. +Создать API-endpoint, принимающий и обрабатывающий информацию в формате JSON. +В результате web-запроса на этот endpoint, в базе данных появляется запись +отражающая информацию о произведенном на заводе роботе. + +_**Примечание от старшего технического специалиста**_: +Дополнительно предусмотреть валидацию входных данных, на соответствие существующим в системе моделям. + +Пример входных данных: + +```{"model":"R2","version":"D2","created":"2022-12-31 23:59:59"}``` + +```{"model":"13","version":"XS","created":"2023-01-01 00:00:00"}``` + +```{"model":"X5","version":"LT","created":"2023-01-01 00:00:01"}``` + + +# Task 2. От директора компании +**User Story**: Я как директор хочу иметь возможность скачать по прямой ссылке Excel-файл со сводкой по суммарным показателям производства роботов за последнюю неделю. + +_**Примечание от менеджера**_. Файл должен включать в себя несколько страниц, на каждой из которых представлена информация об одной модели, но с детализацией по версии. + +Схематично для случая с моделью "R2": + +``` + __________________________________ +|Модель|Версия|Количество за неделю| + __________________________________ +| R2 | D2 | 32 | + __________________________________ +| R2 | A1 | 41 | + ... + ... + ... +| R2 | С8 | 99 | + ... +``` + +# Task 3. От клиента компании. +**Job story**: Если я оставляю заказ на робота, и его нет в наличии, я готов подождать до момента появления робота. После чего, пожалуйста пришлите мне письмо. + +_**Примечание от менеджера**_: Письмо должно быть следующего формата +``` +Добрый день! +Недавно вы интересовались нашим роботом модели X, версии Y. +Этот робот теперь в наличии. Если вам подходит этот вариант - пожалуйста, свяжитесь с нами +``` +где Х и Y это соответственно модель и версия робота. + +_**Примечание от старшего технического специалиста**_: Постарайтесь не переопределять встроенные методы модели. Также стремитесь не смешивать контексты обработки данных и бизнес-логику. Рекомендуется использовать механизм сигналов предусмотренный в фреймворке. \ No newline at end of file