From 848b568b2f136c9ec1641cc6fd5b6183d208594d Mon Sep 17 00:00:00 2001 From: Matt Huntington Date: Thu, 11 Mar 2021 16:53:10 -0500 Subject: [PATCH] all the ham --- companies_api/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 220 bytes .../__pycache__/admin.cpython-39.pyc | Bin 0 -> 334 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 757 bytes .../__pycache__/serializers.cpython-39.pyc | Bin 0 -> 861 bytes .../serializers_base.cpython-39.pyc | Bin 0 -> 1183 bytes companies_api/__pycache__/urls.cpython-39.pyc | Bin 0 -> 464 bytes .../__pycache__/views.cpython-39.pyc | Bin 0 -> 786 bytes companies_api/admin.py | 6 + companies_api/apps.py | 5 + companies_api/migrations/0001_initial.py | 22 +++ companies_api/migrations/0002_company_home.py | 20 +++ .../migrations/0003_auto_20210310_2142.py | 18 +++ .../migrations/0004_company_employees.py | 19 +++ companies_api/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-39.pyc | Bin 0 -> 749 bytes .../0002_company_home.cpython-39.pyc | Bin 0 -> 825 bytes .../0003_auto_20210310_2142.cpython-39.pyc | Bin 0 -> 631 bytes .../0004_company_employees.cpython-39.pyc | Bin 0 -> 731 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 231 bytes companies_api/models.py | 10 ++ companies_api/serializers.py | 10 ++ companies_api/serializers_base.py | 15 ++ companies_api/tests.py | 3 + companies_api/urls.py | 8 ++ companies_api/views.py | 12 ++ contacts_api/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 219 bytes contacts_api/__pycache__/admin.cpython-39.pyc | Bin 0 -> 333 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 659 bytes .../__pycache__/serializers.cpython-39.pyc | Bin 0 -> 876 bytes .../serializers_base.cpython-39.pyc | Bin 0 -> 707 bytes contacts_api/__pycache__/urls.cpython-39.pyc | Bin 0 -> 461 bytes contacts_api/__pycache__/views.cpython-39.pyc | Bin 0 -> 785 bytes contacts_api/admin.py | 6 + contacts_api/apps.py | 5 + contacts_api/migrations/0001_initial.py | 22 +++ contacts_api/migrations/0002_contact_home.py | 20 +++ .../migrations/0003_auto_20210311_2102.py | 20 +++ contacts_api/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-39.pyc | Bin 0 -> 753 bytes .../0002_contact_home.cpython-39.pyc | Bin 0 -> 819 bytes .../0003_auto_20210311_2102.cpython-39.pyc | Bin 0 -> 847 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 230 bytes contacts_api/models.py | 9 ++ contacts_api/serializers.py | 10 ++ contacts_api/serializers_base.py | 8 ++ contacts_api/tests.py | 3 + contacts_api/urls.py | 7 + contacts_api/views.py | 12 ++ django_rest_api/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 222 bytes .../__pycache__/settings.cpython-39.pyc | Bin 0 -> 2504 bytes .../__pycache__/urls.cpython-39.pyc | Bin 0 -> 1158 bytes .../__pycache__/wsgi.cpython-39.pyc | Bin 0 -> 641 bytes django_rest_api/asgi.py | 16 +++ django_rest_api/settings.py | 130 ++++++++++++++++++ django_rest_api/urls.py | 25 ++++ django_rest_api/wsgi.py | 16 +++ locations_api/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 220 bytes .../__pycache__/admin.cpython-39.pyc | Bin 0 -> 335 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 525 bytes .../__pycache__/serializers.cpython-39.pyc | Bin 0 -> 875 bytes .../serializers_base.cpython-39.pyc | Bin 0 -> 721 bytes locations_api/__pycache__/urls.cpython-39.pyc | Bin 0 -> 468 bytes .../__pycache__/views.cpython-39.pyc | Bin 0 -> 790 bytes locations_api/admin.py | 6 + locations_api/apps.py | 5 + locations_api/migrations/0001_initial.py | 23 ++++ locations_api/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-39.pyc | Bin 0 -> 777 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 231 bytes locations_api/models.py | 7 + locations_api/serializers.py | 10 ++ locations_api/serializers_base.py | 7 + locations_api/tests.py | 3 + locations_api/urls.py | 7 + locations_api/views.py | 11 ++ manage.py | 22 +++ 80 files changed, 558 insertions(+) create mode 100644 companies_api/__init__.py create mode 100644 companies_api/__pycache__/__init__.cpython-39.pyc create mode 100644 companies_api/__pycache__/admin.cpython-39.pyc create mode 100644 companies_api/__pycache__/models.cpython-39.pyc create mode 100644 companies_api/__pycache__/serializers.cpython-39.pyc create mode 100644 companies_api/__pycache__/serializers_base.cpython-39.pyc create mode 100644 companies_api/__pycache__/urls.cpython-39.pyc create mode 100644 companies_api/__pycache__/views.cpython-39.pyc create mode 100644 companies_api/admin.py create mode 100644 companies_api/apps.py create mode 100644 companies_api/migrations/0001_initial.py create mode 100644 companies_api/migrations/0002_company_home.py create mode 100644 companies_api/migrations/0003_auto_20210310_2142.py create mode 100644 companies_api/migrations/0004_company_employees.py create mode 100644 companies_api/migrations/__init__.py create mode 100644 companies_api/migrations/__pycache__/0001_initial.cpython-39.pyc create mode 100644 companies_api/migrations/__pycache__/0002_company_home.cpython-39.pyc create mode 100644 companies_api/migrations/__pycache__/0003_auto_20210310_2142.cpython-39.pyc create mode 100644 companies_api/migrations/__pycache__/0004_company_employees.cpython-39.pyc create mode 100644 companies_api/migrations/__pycache__/__init__.cpython-39.pyc create mode 100644 companies_api/models.py create mode 100644 companies_api/serializers.py create mode 100644 companies_api/serializers_base.py create mode 100644 companies_api/tests.py create mode 100644 companies_api/urls.py create mode 100644 companies_api/views.py create mode 100644 contacts_api/__init__.py create mode 100644 contacts_api/__pycache__/__init__.cpython-39.pyc create mode 100644 contacts_api/__pycache__/admin.cpython-39.pyc create mode 100644 contacts_api/__pycache__/models.cpython-39.pyc create mode 100644 contacts_api/__pycache__/serializers.cpython-39.pyc create mode 100644 contacts_api/__pycache__/serializers_base.cpython-39.pyc create mode 100644 contacts_api/__pycache__/urls.cpython-39.pyc create mode 100644 contacts_api/__pycache__/views.cpython-39.pyc create mode 100644 contacts_api/admin.py create mode 100644 contacts_api/apps.py create mode 100644 contacts_api/migrations/0001_initial.py create mode 100644 contacts_api/migrations/0002_contact_home.py create mode 100644 contacts_api/migrations/0003_auto_20210311_2102.py create mode 100644 contacts_api/migrations/__init__.py create mode 100644 contacts_api/migrations/__pycache__/0001_initial.cpython-39.pyc create mode 100644 contacts_api/migrations/__pycache__/0002_contact_home.cpython-39.pyc create mode 100644 contacts_api/migrations/__pycache__/0003_auto_20210311_2102.cpython-39.pyc create mode 100644 contacts_api/migrations/__pycache__/__init__.cpython-39.pyc create mode 100644 contacts_api/models.py create mode 100644 contacts_api/serializers.py create mode 100644 contacts_api/serializers_base.py create mode 100644 contacts_api/tests.py create mode 100644 contacts_api/urls.py create mode 100644 contacts_api/views.py create mode 100644 django_rest_api/__init__.py create mode 100644 django_rest_api/__pycache__/__init__.cpython-39.pyc create mode 100644 django_rest_api/__pycache__/settings.cpython-39.pyc create mode 100644 django_rest_api/__pycache__/urls.cpython-39.pyc create mode 100644 django_rest_api/__pycache__/wsgi.cpython-39.pyc create mode 100644 django_rest_api/asgi.py create mode 100644 django_rest_api/settings.py create mode 100644 django_rest_api/urls.py create mode 100644 django_rest_api/wsgi.py create mode 100644 locations_api/__init__.py create mode 100644 locations_api/__pycache__/__init__.cpython-39.pyc create mode 100644 locations_api/__pycache__/admin.cpython-39.pyc create mode 100644 locations_api/__pycache__/models.cpython-39.pyc create mode 100644 locations_api/__pycache__/serializers.cpython-39.pyc create mode 100644 locations_api/__pycache__/serializers_base.cpython-39.pyc create mode 100644 locations_api/__pycache__/urls.cpython-39.pyc create mode 100644 locations_api/__pycache__/views.cpython-39.pyc create mode 100644 locations_api/admin.py create mode 100644 locations_api/apps.py create mode 100644 locations_api/migrations/0001_initial.py create mode 100644 locations_api/migrations/__init__.py create mode 100644 locations_api/migrations/__pycache__/0001_initial.cpython-39.pyc create mode 100644 locations_api/migrations/__pycache__/__init__.cpython-39.pyc create mode 100644 locations_api/models.py create mode 100644 locations_api/serializers.py create mode 100644 locations_api/serializers_base.py create mode 100644 locations_api/tests.py create mode 100644 locations_api/urls.py create mode 100644 locations_api/views.py create mode 100755 manage.py diff --git a/companies_api/__init__.py b/companies_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/companies_api/__pycache__/__init__.cpython-39.pyc b/companies_api/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa2cf9668ecd85bf60014ab33f9a370ea2e77f6e GIT binary patch literal 220 zcmYe~<>g`kg06+02_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o5j;KeRZts8~NY zv7{uUG_NExFTEr`Pv0d!ximL5ucTN%*wr&g*CSllF)u|oI6tSfBr`v+Sidwcvn1Xm zzM!%sBR?-bB`Yy6Jzqa3KRFRB9iN<^TacKSnOdw5WF=+hrKW%w5TW?Qf=vDR_)L%q Y@p=W7w>WHa^HWN5Qtd!a`wYYk0D%ra5&!@I literal 0 HcmV?d00001 diff --git a/companies_api/__pycache__/admin.cpython-39.pyc b/companies_api/__pycache__/admin.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5217855b1390a8dd57baec581743679c33c79192 GIT binary patch literal 334 zcmYk1zfQw25XS8|DG_RU4l<-(7!d*i5?vUG5K@-l##ZXeK1a4QWZ?mL3Oe#iS(*9@ zOxWqdN%!ab?uOs7)#@CD_&jXh$IySG_#Y&Q+mP-u6plDnNaGq~#1l?bqDf6K5_q3} zWr7@{pH`^Ij^P>=c*+>p5{~$!&hCxw8H~@xqQ2mJ2Ax^A2E3J9n}m~Tp$!+x*))pO zNiU|{icUH&>^HJ`u;=poL0_G)j%w!pZU8T#^9JaHX$LL9J6b(%UdpGp@(y@e88vum zz|jGuZ?2kt^g9F1iGV88vU%OKGoBQVhG{E7@HhnGU^T3lbpB@Dk5hgfNCzcu;%6@6 IF3A%A0nt5PZU6uP literal 0 HcmV?d00001 diff --git a/companies_api/__pycache__/models.cpython-39.pyc b/companies_api/__pycache__/models.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..202ad3e1bd00ac67d930f56920dc863b3a564184 GIT binary patch literal 757 zcmYjPy^_-~5SC&)v4ana%LCA+NZe2{40CYY@s~?Ma>I-op|f@pXJjc@@(ivhprN?o z6}XaDa!YluK*h=iF4Ab{TdnrnKZ&EGF~Rli`RPEbF`8rk;9xnu z-^RSNao&zO$HHm_h*Qo#)k_oH+3M`|yV0hUlu$AU(itV#m1H7g;~t`M#+lOvMk+#wcQ%;-1j%b~%mPq^F+CtG+*zyBJ6_ u?`gVru;aY{8eM>Y7GHWBUHGrmao$zlqlvf2Px_HO#g9#_PsV4F27drTgVGBC literal 0 HcmV?d00001 diff --git a/companies_api/__pycache__/serializers.cpython-39.pyc b/companies_api/__pycache__/serializers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..505d550f02eec2b05d193c548c614abb71ed5200 GIT binary patch literal 861 zcmZvay^a$x5P_%q$Q~+ zqm;-%hGkHNEbR2CjH;N$l)NA^mdPcNiJ})FOXOflrs);LCR5tpJuy`+^k%7SAN#gfY48)XU5 zg)#!VNDbC0@TD>az62Be1NI)$MisE`WeOm{F>H5qBhxxsL!Ntt#WH}H;rZcS%=ug8 z#WZNgD<$NYMp&<`Ylo_;OS4hREr2BDT#HI^-i|o0jBHBO$DD(I*;_0Uv=Ihtlh1`J zrTanbZMf{jugmO%gTPrOyk9li7y8T_ojo&oQz`9TwtW8T-R$MZ*%K{iOH(%Z<}Pb= z;rRnzZ~V$=F4sbznXJ5SiQ{?qLWOb}Xs3l%5*6qsTyaqs8RWcfs+-pvI{}^{Y=^Wd z?aqto(Bi<^TPVgTux~a+5u?CAy81f*ZBe~;fYt;A`Z`onn$S_u-7Thr_FxBspTcbQ rZ*_lL29VD8oDhN?<^7O#)$IE8WSH%LJZ<`@Z_{HO@(yZD;S2r%!o}H- literal 0 HcmV?d00001 diff --git a/companies_api/__pycache__/serializers_base.cpython-39.pyc b/companies_api/__pycache__/serializers_base.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4beb91ef98104ce2df75ee134fc3587fb519f65e GIT binary patch literal 1183 zcmah|J8#=C5GM7q;y6j0K9Qk7fuev1TT90xa9?N|G#+Xc0kp7+$;5Ib$|Wfj&gw3i z`aAlUxOU24=+ryQu^rn$De!Q2q`o7+`{{SN5Xv`{3JXObQnzBxCWUT4XBys2JlFe z+HEaVnq=vfP#VI=pNoEC(n9v;>9>g%H?-PadspP6M2`FT_wsNd=)lwmU<8RNC$R&S zDR-c6lHN~5J#u`}pOdo;El-Zp@fX_QJxJ*w`5(`|YR zm8G`PG|*srafiyghdKNkZ>&LpfG~~M`Y{*c3)pnqVBt@C_X{Hf%ES*xF~_2)D- zgCmh};941AaIFj;p#xJty;ElB4Si0Zka_E0{ujEE0kw_6QaupBDlK^Xikn^Z=1pEA z2$|b~c}q}5aBUR{-++36W`Vg0ZXdQ_Z)P0}9EF)~bIa~3p$$7%pwAzLx>U%9eYQ{t uh@ibH0)=I5Fcqt=l)HC=%3VCL>O5Fv)Aellx_SnO_~vv7ra|Fz_Wge~YY_1O literal 0 HcmV?d00001 diff --git a/companies_api/__pycache__/urls.cpython-39.pyc b/companies_api/__pycache__/urls.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4226cfe651a62632a01ea6cfab5217c9bbed6e21 GIT binary patch literal 464 zcmY*Vy-ve05Vn)F4Q<2Ffp_T8dSOCU1)@k)LJU+0DN8W5)w(!#6g!|);sua+2Riaf zS(*9@42W|I0xbFL`|jtv`)Cxk5uE4E^wwg8-ktOJG{HHBYbIbAVpyUS#~35#F<*MA zANv?_%mVJOg4f0du?B0t_<*zkY1T;SkcAhw*xn5F+gs>_`nU=*YL{Cebxz|!@JF+b zXeP*9rx{g(o4C9CmWdR`x)McGzCQSuL`Fi{qwIbh@Bd^oZmE!${jln=6;%s8EOKdb z52z}X2k^w5)0(8bfW}pen#A$P(KkA&8&n-AgCQ-?m3c$CQ>r!}PvqM0+>jK4%R*V9 z7FH`V(eonZ${I2|n_dmhZw4od4Q5&vR%m5Np@dBildQB$t&-hnMCv)M!^v)Z*xM;^ jClqJDQY3C?x5Y3kt8kQRR!BZ};+YUk7kB+0?tOj%Vf2gb literal 0 HcmV?d00001 diff --git a/companies_api/__pycache__/views.cpython-39.pyc b/companies_api/__pycache__/views.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76bb2de867923f52b245e67940187b9214619c82 GIT binary patch literal 786 zcmbtSy>8nu5GEyClAXAXI~IKb53ZJuMUfybS_6Sm#7GNhVHuHi=u)IZQVEnHOFQ)` znlX>lm20QGLZ=>Or}o|xcsPD1-Ou-l4hDS$_Tz5)`4>j$cew0Y2QG(j>AOOQ-U9G5U=73TuZnyz3-GF8IYS$vT9Kx~B!EsbzhKh*C%g)d49V!x@ z78%3PFY9fn4 zo5pfy0y+M`{u`5&l3II@%u`6T?$2$026>xT)VYgVIiVI#t9+u%y5h>&eExQNI)49Y ze5BZTu4V0nRyMDdaO4$PHSR(y!j@DmbS`yC+cYU#f&{lYMCU?r76RZ5AVOCnzY_e~ zzFajXfl0y+Hq4sgK5mi!AaSrEal#!Ha%R%URkur+_nYv`*$mu1h9`Q~`3qRa$BX~~ literal 0 HcmV?d00001 diff --git a/companies_api/admin.py b/companies_api/admin.py new file mode 100644 index 0000000..1ab4957 --- /dev/null +++ b/companies_api/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +# Register your models here. +from .models import Company +admin.site.register(Company) + diff --git a/companies_api/apps.py b/companies_api/apps.py new file mode 100644 index 0000000..5846c4b --- /dev/null +++ b/companies_api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class CompaniesApiConfig(AppConfig): + name = 'companies_api' diff --git a/companies_api/migrations/0001_initial.py b/companies_api/migrations/0001_initial.py new file mode 100644 index 0000000..d887f9f --- /dev/null +++ b/companies_api/migrations/0001_initial.py @@ -0,0 +1,22 @@ +# Generated by Django 3.1.7 on 2021-03-10 00:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Company', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=32)), + ('industry', models.CharField(max_length=32)), + ], + ), + ] diff --git a/companies_api/migrations/0002_company_home.py b/companies_api/migrations/0002_company_home.py new file mode 100644 index 0000000..c203996 --- /dev/null +++ b/companies_api/migrations/0002_company_home.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.7 on 2021-03-10 21:39 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('locations_api', '0001_initial'), + ('companies_api', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='company', + name='home', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='companies', to='locations_api.location'), + ), + ] diff --git a/companies_api/migrations/0003_auto_20210310_2142.py b/companies_api/migrations/0003_auto_20210310_2142.py new file mode 100644 index 0000000..e69983c --- /dev/null +++ b/companies_api/migrations/0003_auto_20210310_2142.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.7 on 2021-03-10 21:42 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('companies_api', '0002_company_home'), + ] + + operations = [ + migrations.RenameField( + model_name='company', + old_name='home', + new_name='headquarters', + ), + ] diff --git a/companies_api/migrations/0004_company_employees.py b/companies_api/migrations/0004_company_employees.py new file mode 100644 index 0000000..1da0ead --- /dev/null +++ b/companies_api/migrations/0004_company_employees.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1.7 on 2021-03-11 21:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contacts_api', '0002_contact_home'), + ('companies_api', '0003_auto_20210310_2142'), + ] + + operations = [ + migrations.AddField( + model_name='company', + name='employees', + field=models.ManyToManyField(to='contacts_api.Contact'), + ), + ] diff --git a/companies_api/migrations/__init__.py b/companies_api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/companies_api/migrations/__pycache__/0001_initial.cpython-39.pyc b/companies_api/migrations/__pycache__/0001_initial.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd6a6b0126c57564e9518ea64786f58d7da4b345 GIT binary patch literal 749 zcmYjP&2G~`5Z+xoiR~m6ho0cV1tcF*2Ztx^g(v%#c&uAl&{~X?;bHiem2g&_~;ztv5!#!0h*DV zrZi_MqvRz42HqC}o}_E~U~ zB}qzwqzq{4ElKLj&br&QkiB&P6h9w2(B1l140;#~A%Jj8(Tn!Ir3d{jThcUw0m2!& z@cciHOV^tec`5Y9F$HIiO;2Or4MbfPd|{-hB)EQQR4&Yhzn2>qT4|KX)FHJ3DJVekj#X-eKo=Lr|RxVH)YFn92%*+7Ou6w0q2KFNEyMVVpbM7L}k&rr* zXb(8Qu0_^dh+a==Rbfjv09i^6QZJOW2A4xzf6`(+Z>Th06A4cc`dQP!g_D&qJ2NUu zc}x5cV(w#MtA2e;-rzho$wgJIYF#NrT zR~L^xL=`Zf`MysXJERBn;5Yl@|7|NSa7p2=?-9&fF52jB>6f@eE=pEoSo IhP->;KRv?K9RL6T literal 0 HcmV?d00001 diff --git a/companies_api/migrations/__pycache__/0002_company_home.cpython-39.pyc b/companies_api/migrations/__pycache__/0002_company_home.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9136e11bcb4335839a055837eb92af37d76cc3c GIT binary patch literal 825 zcmY*X%Z}496m=XYO){;7Sn!ZwPZv!JVmU%H5;HJj=z`7&DI1ganl@2lhddT#3oE2q z@&PRQC2v{r3rIY!lW99x^7Vb$$3Dl&XcQ0}U%s8adqfHOVS<~3VQ_@A4$%MsD<_2& zTLq1&Wn!A!F?&J42KJc%6ISMYvSSD6oQ$2HxQC3X4vKVDB~7Yit=&R_$m`kC)NT$R zgCm^vAsRtq3rI}C0=lBHEm-Cl4B=)2aDPDN{Y1PN$D~D$^!Sa#LQaqD*8eYE!OUM2`o3Zll>+72-nsyPl7C{yQz) zMq{R#Z1Y_EN^*RlXoMbCB2O9tTqcFkv{7RlsW8v)Gpx%y?^BV(Y&_B)@A91MfOG6? zbAkSl^ABy3n_d%vD1`(emw4d{6(ia^1~@fmRJI9&Q&ov{C0~h+b|FjTN@)rU?RB?8 z4YW5ux!|+Q^K%`jQd|r3om3BSduM)qjV^0Z)lrc&&AOFMDp!q?(Q~zI3n802nxCA# znY?^EIhHV)tGw;Bjanp?Kjr17SsNBQ>}bnS&37b5=q*wyz&LyEqy0CDP^2f<8#dgC z5SE+De8vIJ`ZgNRrWXCfTxQ{F-TTe{cJ;BV{T?}lMMqFi%l%z4?0;am<)gZ5-fhm_ XGthevF{i!5UW#Xi-P*L>vON1Aj9>D$ literal 0 HcmV?d00001 diff --git a/companies_api/migrations/__pycache__/0003_auto_20210310_2142.cpython-39.pyc b/companies_api/migrations/__pycache__/0003_auto_20210310_2142.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5296ea5b2872bc5935b238f1b5b2b95524b4a65d GIT binary patch literal 631 zcmYjOPjAyO6u0A~>q;xZ_y&ke51rF&M}&sN7(1}TDumRF@$#%TRbq$O5$bt6A@K<~ z?Z{X1l@nh9361BZsC$v0e(#Tee(x7KnT!b9xBJV_H6`R%2p(IE!5JR=0v!;bC8_9= zQgT5c0(M7$DY}Vn*)oE7L8i%X>?2d^M^&+Eq$`ZJc}P9B1cNg?_9Z$+mJ|qHrz^T- zD&8c47-C4iGt3NNfV2nx@WX$;Y2+ulscNYUWreH@|13?@O!T>}Ser`ugI(m~E*!6w zgfFdZoNDZp;dBO6DYV4ap($a9wEEhiD|~P$Iw*u634!fxsSuBaK$8O`6CyseaWmM_jP zuV?Q+&E9C3Elk;VI`UQ*PMnH*>()jK*hsxHyfk?)^G*PqgyZrzg;o&2UMIf)B^(ty z5wdkgWN9`}Pv)t}=BL?ly=@qdIlyC|q8qa4Ax>f%h3{|t&{eNc!NdOfW4P(|?(+K$ Ud-NO${P0yT-s`|?gGOWa51xOr9{>OV literal 0 HcmV?d00001 diff --git a/companies_api/migrations/__pycache__/0004_company_employees.cpython-39.pyc b/companies_api/migrations/__pycache__/0004_company_employees.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0e2b3f0bc1490e2a6b632105c2e95d8b47c673c GIT binary patch literal 731 zcmYjP&5qMB5VoDPO{=Z=5n|r}sfRXcw@0+v75_-P2MR*U#bh(4O_kUob`IeR7Y-}# zyaCU`8~DnJS3u%toD|xTJei*_GoEjpjK?E_^6B&QH{U2B-<@+PK00T3^gUESfaav2 zF)dikD0xDFf%lPsC+ODu;Kd&JD>CW*KrERsJ1Vkum6%LPZTp1+k?Yi@4yBLI86G`D zB}hzx#0)5~HH$srZ+n16MSnYh9`vs%46eO3jROd<(a;Vr{&m21N2!t~NsZ=7nb})W z6fO8J#5bxC2pOlUC=;294s(o{6Q0yY@kO+lMqS9fJ7_+IR$>iE7 z89r2LT?lD(xO(*L#q{ax>A8gIO67ICp|F;j;Y(gNW}_sBZ6eny%vIVg5SiRD7ov5Q zNdeB-lNs)p9U`sE-46}_&)}?VD)*k;%JpqjfyXHO?e~3(Upo5b|7r7=6Wlo|U;C{#IsUu1|@@{&60XzlLXaE2J literal 0 HcmV?d00001 diff --git a/companies_api/migrations/__pycache__/__init__.cpython-39.pyc b/companies_api/migrations/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95226e9fdebb93eacc952cd17890e5e002887085 GIT binary patch literal 231 zcmYjLu?oU45KX~Bgno!ay~R;PK|vP>i#W#Egc@n?N|Oxz1@R{w{UujF!Oh9U4*KA| zd-v`*PNeC81zc|HL#)pz|42eJ3$(o;lI3ieZ0@Xy@lW1Y*jd$BFv7W$N2jrLgs`B( z8->n7zFcp!)jpe}%yO!{(}Wg0YRAXCZrzEH%d^0eprS&2$Gjj@3)IR&a7T?wM$<)H e)EbN~n{F34*YOx1)$OA{F(iGZrt!;HAo~D$$wP?% literal 0 HcmV?d00001 diff --git a/companies_api/models.py b/companies_api/models.py new file mode 100644 index 0000000..b4ab521 --- /dev/null +++ b/companies_api/models.py @@ -0,0 +1,10 @@ +from django.db import models +from locations_api.models import Location +from contacts_api.models import Contact + +# Create your models here. +class Company(models.Model): + name = models.CharField(max_length=32) + industry = models.CharField(max_length=32) + headquarters = models.ForeignKey(Location, related_name='companies', null=True, on_delete=models.SET_NULL) + employees = models.ManyToManyField(Contact) diff --git a/companies_api/serializers.py b/companies_api/serializers.py new file mode 100644 index 0000000..6b6faa0 --- /dev/null +++ b/companies_api/serializers.py @@ -0,0 +1,10 @@ +from .serializers_base import CompanySerializerBase +from locations_api.serializers_base import LocationSerializerBase +from contacts_api.serializers import ContactSerializer + +class CompanySerializer(CompanySerializerBase): # serializers.ModelSerializer just tells django to convert sql to JSON + headquarters = LocationSerializerBase() + employees = ContactSerializer(many=True) + + class Meta(CompanySerializerBase.Meta): + fields = CompanySerializerBase.Meta.fields + ('headquarters', 'employees') diff --git a/companies_api/serializers_base.py b/companies_api/serializers_base.py new file mode 100644 index 0000000..7e9d217 --- /dev/null +++ b/companies_api/serializers_base.py @@ -0,0 +1,15 @@ +from rest_framework import serializers +from locations_api.serializers_base import LocationSerializerBase +from .models import Company + +class CompanySerializerBase(serializers.ModelSerializer): + class Meta: + model = Company# tell django which model to use + fields = ('id', 'name', 'industry',) # tell django which fields to include + +class CompanySerializerWithHeadquarters(CompanySerializerBase): + headquarters = LocationSerializerBase() + + class Meta(CompanySerializerBase.Meta): + fields = CompanySerializerBase.Meta.fields + ('headquarters',) + diff --git a/companies_api/tests.py b/companies_api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/companies_api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/companies_api/urls.py b/companies_api/urls.py new file mode 100644 index 0000000..af23f01 --- /dev/null +++ b/companies_api/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('api/companies', views.CompanyList.as_view(), name='company_list'), # api/contacts will be routed to the ContactList view for handling + path('api/companies/', views.CompanyDetail.as_view(), name='company_detail'), # api/contacts will be routed to the ContactDetail view for handling +] + diff --git a/companies_api/views.py b/companies_api/views.py new file mode 100644 index 0000000..df72b63 --- /dev/null +++ b/companies_api/views.py @@ -0,0 +1,12 @@ +from rest_framework import generics +from .serializers import CompanySerializer +from .models import Company + +class CompanyList(generics.ListCreateAPIView): + queryset = Company.objects.all() # tell django how to retrieve all objects from the DB + serializer_class = CompanySerializer # tell django what serializer to use + +class CompanyDetail(generics.RetrieveUpdateDestroyAPIView): + queryset = Company.objects.all() + serializer_class = CompanySerializer + diff --git a/contacts_api/__init__.py b/contacts_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contacts_api/__pycache__/__init__.cpython-39.pyc b/contacts_api/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..333a6cc6a8f63bb865f2cc2a99a43bf75be385de GIT binary patch literal 219 zcmYk0u?oU45QbB55TOs^P_sCSC@9#)!6J?^HldBQccHlq-JE?3M_>nA_5WK5fK92g||T-iD*M+@gvrd8Fg`^1xSM^S?Pk?TC2iey|fsEGjwx` z2auc!l8+$Rg@TIFJ;Hk zE8V~!(w<8S%5P*06ch2QbBn2T=BuW=|ZYU@a0un?(a0Lg7w9T^dE;*m<-NU;sF744! zAfAI)a!Zw0pkl_3au=DkJeu8^o%v>F#dtgE%Bjj`7-M(ckx$`N5k@6p zp7J+@1uB$OdOst%FTcw=3I+Xao!9$FO94V)JL2{%|&OaFn1GR zm?rv~t3uk}q|TCaX)OolWPj-+r8&Urb(VIhmWH z#_rp+*16+P_-gGIMsv9o`pTrm?QksbICEuF&@OYWBq;4%Ef=dig_O6`wbRwQ8UxNA z{1#zj+U{q`UWG5O+D9=$fdi{z6d?+{(U#ZxZ)@tb1GGjU(AT08(})he_H336*uf42 uzl2BD#$qSiDu8s_b3zDqa#tXh(|2n5Fz5fMn)q2atLOOUTeJ~{&-(}LW8IMe literal 0 HcmV?d00001 diff --git a/contacts_api/__pycache__/serializers_base.cpython-39.pyc b/contacts_api/__pycache__/serializers_base.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f8fafe37b214000c3ba4947d80387403803a68c GIT binary patch literal 707 zcmZuvy>1jS5cbdRqnlx0AhCv6a7<6FQtl^3SdXb<1g_!?Ce=DQ@4-gv;fX~(dHE#+3~OU5mdclA5p_MLVq*7NsAAE$?(r*E8^&b{rE@h;ZA zGfBJ@%gc1`olqCjEqrZ#D~GgbeYcd(=vaewYMfSJ3`|EMm!@7@g*XMeX3NW5;5$ng zEaJ>#TF~$mjFYMePjFoPB4G;^h991=vUV|s)mR)Es4*RUBx)z0>?e_|=N(*SOJP)Crxidv*J+!Ty8ptx<U_ z^~5W9FisaVOwyUoH$UIZ&`zg?K;G7q`zMUhmvi=|0nRBrGX}*F!zq$D!Wgj{^U|91 zA`c^una{n2|50BfR%eZO50EAxjS2}IGOI;Rb}&V~)&@GE9xnZi+W7`Zol}1n{Kc$7 znhBCid=48lD>>AviCT6>4U+ zB4eEtk}GS-^kQ<;zr5?8Db}Crw6H=eLkcBqd>m&>JJ%}Sjz&_Q&?+1!T4q!UZeV}; jAQWf+hlt(AZizv*EQ6uctVsFDUCsocLL7Qs-2M3ld<%-3 literal 0 HcmV?d00001 diff --git a/contacts_api/__pycache__/views.cpython-39.pyc b/contacts_api/__pycache__/views.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad50c1ac7c769ae64651bf7e9d390e680022fc39 GIT binary patch literal 785 zcmbtS&2AGh5Vm)d-A&q*mLuW?atM3jh)}Dhf=E?_8Wkj8jJr0egV#=NZ>u12f)h_c zk9`}?zH;g-aALeoN$$+bqwzPp^YeYn27^8V`*Az@_zNTSJ6^V}1D8WM?i3tH94k~~ zf-&L=PgPQeOA*#pn&LFvhP&DM`Vj(K;Lduj1#Z@Eh z$_Z~HIb`4c8Cs`1ijS2kLD`jReJ{?cg57fjDhsZ7P%G_6d%WLgSWLUbXu;1IN&Im(u@yq4m| zy;!bn27|;ETpYE)ecU4d!Qo)d;aGSk)zs#Xn{IZtPa?Jtt_Nq+IU>_xKkQlIJpE*W z`Ws_E+bCez*|6wZUPA_o2<2J@$U)TX*b3&w(YwieSg&1#JU;^&q_`I6OAfg)RJLaI f_)6@!HCL-j94-{E9^`%<|2S8G+r{uCPdk4BwSvWQ literal 0 HcmV?d00001 diff --git a/contacts_api/admin.py b/contacts_api/admin.py new file mode 100644 index 0000000..e5ce258 --- /dev/null +++ b/contacts_api/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +# Register your models here. +from .models import Contact +admin.site.register(Contact) + diff --git a/contacts_api/apps.py b/contacts_api/apps.py new file mode 100644 index 0000000..bda4cc0 --- /dev/null +++ b/contacts_api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ContactsApiConfig(AppConfig): + name = 'contacts_api' diff --git a/contacts_api/migrations/0001_initial.py b/contacts_api/migrations/0001_initial.py new file mode 100644 index 0000000..7924d5d --- /dev/null +++ b/contacts_api/migrations/0001_initial.py @@ -0,0 +1,22 @@ +# Generated by Django 3.1.7 on 2021-03-09 21:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Contact', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=32)), + ('age', models.IntegerField()), + ], + ), + ] diff --git a/contacts_api/migrations/0002_contact_home.py b/contacts_api/migrations/0002_contact_home.py new file mode 100644 index 0000000..7e72b6c --- /dev/null +++ b/contacts_api/migrations/0002_contact_home.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.7 on 2021-03-10 21:55 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('locations_api', '0001_initial'), + ('contacts_api', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='contact', + name='home', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='homes', to='locations_api.location'), + ), + ] diff --git a/contacts_api/migrations/0003_auto_20210311_2102.py b/contacts_api/migrations/0003_auto_20210311_2102.py new file mode 100644 index 0000000..2fd6a52 --- /dev/null +++ b/contacts_api/migrations/0003_auto_20210311_2102.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.7 on 2021-03-11 21:02 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('locations_api', '0001_initial'), + ('contacts_api', '0002_contact_home'), + ] + + operations = [ + migrations.AlterField( + model_name='contact', + name='home', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='inhabitants', to='locations_api.location'), + ), + ] diff --git a/contacts_api/migrations/__init__.py b/contacts_api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/contacts_api/migrations/__pycache__/0001_initial.cpython-39.pyc b/contacts_api/migrations/__pycache__/0001_initial.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc0db04cd4b508ec298848adab8d9067ea672998 GIT binary patch literal 753 zcmYjP&2H2%5VoCkcau#Khl&dvI3ew!O_4Yv)M`s%53LXjLdwOs@igltu|w=2mMff) zR=ff|@=CsP>MJ1eGszaUW6fyBV|%{&#$tOrCMaJoW^eB>LVk9^O$jkLK(!ChNFr%T zDw@%XWsH(%L^2tCAu<5E3_b^0Aj3JCY+d46GGRWhRM7~hjJAGI840D$yVOmIFgQT9 zFVFzVs3aMaGz$ung|M|8bR}T897&2Rlv{GJ4$qk!;$9?2GFnrNVifjN5Oo|Un@x8m#GwMgjnf`>vmlOD)k?HbQF>roA?0GS8M954*h}mj$`wvX zz3~S)@|S$ u(-W1Mu^V#(uqGh;vdjkEDMCOAHSJ$d_x67t=F+k+uEz^P|wfPhz# z+DpBfrqpwoR({H!6Yzn3BEW=K1|R)20JRwIV{66E_Wb=0YujfhS&beOGgkR?~Wb5 z+7Kf9xKepf&a-u4NAvmoF)w6cimbx)C|A;CxzR4$gh-waZbFt_s#=_Yx15cPVU&1RcOzyZ+4kp@_62iJ!8LTHW(xb#^*0D-i|Rs-#xfJ2!JD))d&nnJW!|z zvY@~j4m`#x%*a#3Lry*+PDGG*K89I`;~5%ue!v+t#4ai1vSd~oUAd?*T&U`N;d8e~ z55N)3>Hv&DS-??-dBE`!XQ3c@$M+CX-sK$;=e<12lYECqyvyS&!h2WYGRXQofxbJg z_iEb^x(}3Dw9P47OV=Nd#}g{Gw2~=E_ZLQ6wy;%`y$jhXy$;cpDTM1@BS$>Ea63}3 z*j!qsZS~>)f5k^zG$fAbS}E5vn!p_5G#7dyMOA`;$R)?hit^M~DZ?gkYDyuO`lZ;o zi04c%jl+EI;^tl;ii>9_7xet{?93%*Ev}XNhRTO0(eMgC(mE+J$tivtoh!|sJan5t$}6wn65W=<#}j&r(2FHpt)Ex4L480n@cS? zI5%RXH{T`&S@tQbt)bKLbTZzbOeieV(Rx$*FWQA!-2)ScIKaP2L;_fY2fxUlCO?c^ wuWdi#^ML!{r{>keC8*ds9PB9+>vc-}KVMax8 z2H8VCU#_#oHk+c(a;gGbLJt8g%b~1Kd?1wisIVlcs8F9+7UXJ$)_90+Z_(&zkX6B6 fs@j6HW%FGHDQ&tX2leUR89CCSGUN2*Gg7<(GtWaP literal 0 HcmV?d00001 diff --git a/contacts_api/models.py b/contacts_api/models.py new file mode 100644 index 0000000..99809e5 --- /dev/null +++ b/contacts_api/models.py @@ -0,0 +1,9 @@ +from django.db import models +from locations_api.models import Location + +# Create your models here. +class Contact(models.Model): + name = models.CharField(max_length=32) + age = models.IntegerField() + home = models.ForeignKey(Location, related_name='inhabitants', null=True, on_delete=models.SET_NULL) + diff --git a/contacts_api/serializers.py b/contacts_api/serializers.py new file mode 100644 index 0000000..b1aabd1 --- /dev/null +++ b/contacts_api/serializers.py @@ -0,0 +1,10 @@ +from .serializers_base import ContactSerializerBase +from locations_api.serializers_base import LocationSerializerBase +from companies_api.serializers_base import CompanySerializerWithHeadquarters + +class ContactSerializer(ContactSerializerBase): # serializers.ModelSerializer just tells django to convert sql to JSON + home = LocationSerializerBase() + company_set = CompanySerializerWithHeadquarters(many=True) + + class Meta(ContactSerializerBase.Meta): + fields = ContactSerializerBase.Meta.fields + ('home', 'company_set') diff --git a/contacts_api/serializers_base.py b/contacts_api/serializers_base.py new file mode 100644 index 0000000..537a4af --- /dev/null +++ b/contacts_api/serializers_base.py @@ -0,0 +1,8 @@ +from rest_framework import serializers +from .models import Contact + +class ContactSerializerBase(serializers.ModelSerializer): + class Meta: + model = Contact # tell django which model to use + fields = ('id', 'name', 'age',) # tell django which fields to include + diff --git a/contacts_api/tests.py b/contacts_api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/contacts_api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/contacts_api/urls.py b/contacts_api/urls.py new file mode 100644 index 0000000..6564ef4 --- /dev/null +++ b/contacts_api/urls.py @@ -0,0 +1,7 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('api/contacts', views.ContactList.as_view(), name='contact_list'), # api/contacts will be routed to the ContactList view for handling + path('api/contacts/', views.ContactDetail.as_view(), name='contact_detail'), # api/contacts will be routed to the ContactDetail view for handling +] diff --git a/contacts_api/views.py b/contacts_api/views.py new file mode 100644 index 0000000..c776b71 --- /dev/null +++ b/contacts_api/views.py @@ -0,0 +1,12 @@ +from rest_framework import generics +from .serializers import ContactSerializer +from .models import Contact + +class ContactList(generics.ListCreateAPIView): + queryset = Contact.objects.all() # tell django how to retrieve all objects from the DB + serializer_class = ContactSerializer # tell django what serializer to use + +class ContactDetail(generics.RetrieveUpdateDestroyAPIView): + queryset = Contact.objects.all() + serializer_class = ContactSerializer + diff --git a/django_rest_api/__init__.py b/django_rest_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_rest_api/__pycache__/__init__.cpython-39.pyc b/django_rest_api/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63901f34f46373913e0b2f8b61c6941cd6c524ca GIT binary patch literal 222 zcmYe~<>g`kg06+02_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o5j`KeRZts8~NY zv7{uUG_NExFTEr`Pv0d!ximL5ucTN%*wr&g*CSllF)u|oI6tSfBr`v+Sidwcvn1Xm zzM!%sBR?-bB`Yy6Jzqa3KRFRB9iN<^TacKSnOdw5WF=+hrKadZ)WjF17MH{)7G&zj d$7h1fh}SEqyv1RYo1apelWGTY+-D$W000N~Kji=b literal 0 HcmV?d00001 diff --git a/django_rest_api/__pycache__/settings.cpython-39.pyc b/django_rest_api/__pycache__/settings.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18835ffc99de7ebb562c19f6013a26df09ad3891 GIT binary patch literal 2504 zcmb6bOLN;qSaRgpapE*>`l5vybs*EYB@#&=0fv^Uwvu@2*I0G~x(Hdjwl~qM+Eqey z?Qr2Y^gw%KhF_#BC;k8jV5WSM9mnHzh9G%&wcmTc*V-%=3miN@zpei8Q<39-Pd3v} z4mQtV(BEJ}oX#O0Wo+Kb=oy~F89euz|3!Gq9b^x(`aGJ`b4bwh15RHUa47qZ*9)-D z!@3CYC6v>P2(U;%3BK@-Cp=nwBMf+b87=9TP!TPoOK1h&%jn9REaCMPw2H0*)hfD{ z&ezlV2H^*Sei_}=ub_|gRgirZ#x)q%(JlQ3x~*}gkIjcX#}z6EraSONiWwvBfQo%D z5K#&<0!*1<`b6{t?*Lm&Din6HivyEkB=%0kyCb>{6FI~cDKi5$ro1bL6r_n`;SZ!u zX&bnAK(^xrSR^i}aZE-$SA-uM5>QNR{5jZx3q!_y`n4=0&!W;u$EgLD=g8QVL7>b$ zpIB5rHC!HvXG1LZL)#W@LYe6G&kkm~2ozxwh)1R!V)}n{1-L(@=nn`rSK?!#WwK$k zwZ6Hv?wirt;gjI2E!5wB>^g{jwr(9Gdc1wO{p8NQt)nCK=#h!;`)iw*K3bbPpyUvQ zYyvG?F%~jKL9rDEgq=v*_+yIv;jGTFmD3uu5p0U9bY2NK)$v@gCRzT2 zlm>mN4AV=3kEcktXKXRS$J2Hwum|^&Q81?%XAg1e(P`%T$jeh)k3Vn-n^=bjrgaF# zCVjV)o=)nx}#G4;rIK`EO zIQLvBzfc<$U8q#sTAWu}EhGKPHCvr(v!O+^eNZ~410tEe4_;5}GtMF0H$$66pNwrl zy)!@h9%Tb4)>pP(7@?Euj=6Xtsc(A-=u$SGR~x(4h8hbEr4DmfQ`>RArD)oIvt5aW zy{6U)k}D|Mn>l8hZN5n&KpM3ml8Nc#IuiZJnus{a+#igu4rl!`M98|<+j=}UZ~&4 z*^2tSyBimkTCKUSR*WPLTD)9sXdM6n0MbQ^3-xNHQd9SpwyIw*H`|(#(kHXgY*!($ zTD;V5HakYQT`M;mJMltCt+#4QN7dq$eQmdz$f;G!N|JH$LPhB)i8)$)Q|Wg0jMF?Y zUMjUJAVEW1tSOD%uCl8d#PzreRH(i&^PsRG0_HmwrkurVR^lDe_mx{B?{c3|6u!*2Ww zj);HMD<}Q};=r?;ZV?jF9L0TcKfm{VpP$L@ZXCe)`fWJ=u@MA6-A8k@;o}XwW(*Sz zMga|Js|ZDF)Cyg^QEZ546!|zRHbr~X4g(g^P1dIE+witk$DKyJRma<`wdgFiZdI#zPZXO$+FD;dWh<_wK1U6jOHrllF9f*Xsp zsw^{ZgF#lIPn>-=DLPde38fk0a;miODNtE3Vi+=v4PpdiZf$7>7*my-bj6_5YQb`w z=1O2D@$>W$TUGMhUhNc)k+|7 z4Z_NLv4MY9H|TW!LIBQfK&@WQ{%WraYMKq);;q2Cggh+=9>BOOp5(w0Mw&%S}QBmk>nGaro`j z_+@bO1h`w0TjM&@@4R_hsNDBda}9c?B$BhnTHB|^?~{1h$uj7(EE_$lrMaw{Pc(FY zuA|qE*3Ohrr3~!4y5-3E|oBbGY;8FF)~a2mk;8 literal 0 HcmV?d00001 diff --git a/django_rest_api/__pycache__/wsgi.cpython-39.pyc b/django_rest_api/__pycache__/wsgi.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff991903b9a97d6582e86f7f4190b5fe26bb98cb GIT binary patch literal 641 zcmZ8f!EO^V5cO`-CM*}m3ucKMx8HYzAwXs4EC>oMigi=Dx*tVQn?l; zv%Cc7xhNDZO1p;C$5Ax(6h0N!funu}w7n>_7MB{Ra8%IT%1Xmf!v-|nh*IrRM&uyr zVj+q`t5kSp&0>M|P7p1(B~WD$INv3xHCS9Zx>OpTQU?&Nyf54<#-vSM+_L+}DYZER z!(PPC*~(sd%On)qZgVi6UAauL=r_tjW`m%9oPp=f9yax#MtwMXcRZV%@??B=Hl0lp z{^4|V{(gM@R7Vt8!iFtNI7By_AY z%JY}J*!q<y1_bhXncF1B_5b^CHh_{E6pqwC)5hY!Ms F;a|Gk&xrs4 literal 0 HcmV?d00001 diff --git a/django_rest_api/asgi.py b/django_rest_api/asgi.py new file mode 100644 index 0000000..5575bfe --- /dev/null +++ b/django_rest_api/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for django_rest_api 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.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_rest_api.settings') + +application = get_asgi_application() diff --git a/django_rest_api/settings.py b/django_rest_api/settings.py new file mode 100644 index 0000000..da4cbad --- /dev/null +++ b/django_rest_api/settings.py @@ -0,0 +1,130 @@ +""" +Django settings for django_rest_api project. + +Generated by 'django-admin startproject' using Django 3.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/3.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.1/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '(12(paz%k=r92df76nmdt$(cwdsw7k7=!*2vvd55ad+p%112!%' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'corsheaders', # add this + 'contacts_api', # add this + 'locations_api', + 'companies_api', + 'rest_framework', # add this + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', # this makes the cors package run for all requests. A bit like app.use() in express + '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', +] +CORS_ALLOW_ALL_ORIGINS = True # add this + +ROOT_URLCONF = 'django_rest_api.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 = 'django_rest_api.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'django_api', + 'USER': '', + 'PASSWORD': '', + 'HOST': 'localhost' + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.1/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.1/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.1/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/django_rest_api/urls.py b/django_rest_api/urls.py new file mode 100644 index 0000000..ea6d721 --- /dev/null +++ b/django_rest_api/urls.py @@ -0,0 +1,25 @@ +"""django_rest_api URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.1/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.conf.urls import include # add this + +urlpatterns = [ + path('', include('contacts_api.urls')), + path('', include('locations_api.urls')), + path('', include('companies_api.urls')), + path('admin/', admin.site.urls), +] diff --git a/django_rest_api/wsgi.py b/django_rest_api/wsgi.py new file mode 100644 index 0000000..6dbc105 --- /dev/null +++ b/django_rest_api/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for django_rest_api 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.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_rest_api.settings') + +application = get_wsgi_application() diff --git a/locations_api/__init__.py b/locations_api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/locations_api/__pycache__/__init__.cpython-39.pyc b/locations_api/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31c041aae681315f832aa9a003de40c9bd7e5b73 GIT binary patch literal 220 zcmYe~<>g`kg06+02_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o5j;KeRZts8~NY zv7{uUG_NExFTEr`Pv0d!ximL5ucTN%*wr&g*CSllF)u|oI6tSfBr`v+Sidwcvn1Xm zzM!%sBR?-bB`Yy6Jzqa3KRFRB9iN<^TacKSnOdw5WF=+hrKTWBCKhDs$H!-aOo-Pj WsJz8tlbfGXnv-e=a@uDgW&i+!^*cP>HF_acsXrOecDFrXCVhKkg_$$pGeL@0=Ws{u0rC7V}&%XF-AP$L?xQk1S5gB z=~pJmKF-q$71<%EQGv&daV_D1Pb_~lE%VaAQ!%M8`IbRv=B)v5<=Q4eGfuSOLOGj8 zk~-*3P(e?mLT}qlJ$}v-*ahbP7k-vjH6k#(cCF6xkt=ShBj2Uco2#TWwGn6>o-FOT$=L08x4-Z=Gw*I}Y zya{e(N_8&9ZXXIjqftqpNx{WhXFCU6izqMwA%d2i5HlhK9?}#RhlD&ewCEzW%{9Zb zjMkSqFIX~Ay5?LbUYhHz@s*~Uf1x^rv{wDR#P^EVDlVzkStE1~Ev1OhW!jWnXcaFn z=693phsmj6lcg*g`$`ozBG=@IR9l@%LD+_hwTz3uArwhvSy7R56$4u3g0o(bR(ag< zIIXs|rOy6`8h{FL2&?riBF_xF!c(^D2J>$%{cZSvgbt12wh4|qT28PnXt@a8Uu2nw A3jhEB literal 0 HcmV?d00001 diff --git a/locations_api/__pycache__/serializers.cpython-39.pyc b/locations_api/__pycache__/serializers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..403bc8352f6460da4d92e7558d189e19e1168e39 GIT binary patch literal 875 zcmZva&5qMB5P&`0Y~=f(TlW zl4g_=;R(O+N;nguf4Xc18Q zA^^%j_Lebl#v%mHs5v)|%`CiE8tsHy8 zR%^E~nu#UXS0*hsowIC9nSwS~T8bSbU#S#wZklT+t93O3o<95*X=B>%r%AuU$*Yb~ z3{hb7su)Fx0&leSwf_H$>a=6DMj+7Fq7u^q9eC~8H0d?RI}mIRGuFn+9_HPISq7k! h10Q6_9&HP}+o{FFly^Zj@w2X1=Q#2$*^t8L{R6{;+|mF5 literal 0 HcmV?d00001 diff --git a/locations_api/__pycache__/serializers_base.cpython-39.pyc b/locations_api/__pycache__/serializers_base.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9fa4a0b1e22141809879b90edb74ad25b722240 GIT binary patch literal 721 zcmZuvy>1jS5VpNPtda{MQj`Lo;EKC#C=m)Mh(sbOI3c8MjI(wU2d{nDUZG1H8h8uJ zypr2gc?BwF_JFKJM)GKWcD`@?dBxV&1_Ar=^XSt7CFB;9vE`8L!wGY6l1OSuM;l6s zWHK|X%bJXmw?yW$_(o)*=w*JLHH9n}Wcuh1X2_JL&7iy%Mqeo(?tler)jQXUsGV)` zqp@X>?86C9!70*ENg4(eR5GAo*R0882Jm^>`-`#ohyPjx^&cWq4v4!WM3ptUq_8Rj ztnBL9!&viU6$MZ+EmIkyS1P8w)p3=I5Jglc(=t_@ThS@b(+20AlfA)s!ugk8n03da zj;VmAGO0Y%%E)j-{5Dhv_v?H80YnOQCt|$lZPfNWI$IyOw(pdUpdOth-ID2K~ zY~f6g(uKOWI`Zdyxr!Iga(OB2xvR||WdmZP(yU8t&*drSn7K8F#Hsxn=e-> z$14}GS-_<$np3|6!O1lD_^~e_0{>$ k9^0uLR0(T|wvSPw`}Z71AL2;Wi?!4*@pXq)Cv?Jo1AWc4I{*Lx literal 0 HcmV?d00001 diff --git a/locations_api/__pycache__/urls.cpython-39.pyc b/locations_api/__pycache__/urls.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b1a8fbd542c6fa345fe03a06f5b4812d24afa13 GIT binary patch literal 468 zcmY*V%}xR_5N_E8R$w*Z;5%@DUOX8>G{Hm?;z43e_Oe#mK(X6ywp|G%zJQ7EAV*(m zuby}X560;#ij#CY^Ud!!Gz=REBs6JmJb3GPxLCcQ0?d=ZbYFTIMAsk}F~3lQ>=3xmNM_a(|5DsZLU=1UCe%d!abn e3p(14M=xC!K|j$fmwez3XaZ0z-16GE{rLslz>T8- literal 0 HcmV?d00001 diff --git a/locations_api/__pycache__/views.cpython-39.pyc b/locations_api/__pycache__/views.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c786693a3fb48f3ab2121e18718866223433437 GIT binary patch literal 790 zcmbtS&2AGh5Vm)d%_g*^?Gf<;IfT7%M5q<1AW{^eMg?gv#$6AogV#=NZ>w~`u-UjnN1qs3J8j zDJ3EisY>d!OjqZYYSrzsP04E_+9LZ#L_A{~(GvKmBk9wS z&p?Bfm3zPjB5*u575CEUDZ*UI&tT)V4O+$jc2|PV32yfU4Um!wQYMhjTR+-&q|BgG z=7M6yBNVxR1-&cMWdx>&)H(>uZ(75&h^X`>Mt{nRi<8WEx{Fdx|ABkPLMBTaUYx15VgI|$0ljvfVhD;A?1*6kT@dLs-;kg_CP^Mdoj+An>g%xm$erWu5d!C z#9!dZU-Fex{sKb4cvIA1%cFTavomj=Eq8VX1lN~uCvOBJ_WACE@0yHND zO=-bWM#)nG45H5jB1M$^n>Dz{k(ZLb)?J{~(m zqex1Dqzq^p%}L5tXW0!cRBzb_ikm|Rx|jTdK@Y#h(1-YvA{zXMhAkRxVsj2Vmuybc z0qi2V8$Le$$Lgi;KQFVEpl2G6Jv%uXb3c-eD@9f-=@j^3RqI05EAdvXd~8*%Wv)Le zKYFj~S!tCpvQWNjU9FT`-@_@!6epJ-M6S%-Ej-V(TltQ4SZ<9P2W9x?rwgreuxI0; z?~AsM5Pl#8O4Z~F{gDvw8kvV=L_KY^!|r|rs!|4&$+WU{DCviXE#1=~avg;)@c~Y8 z92)rea3SlBJ18r4btT_PeFqa;^Yd%+3P-a^A)Q+^#%ZKpn&ha=nnD?8lk+DhFDB1k zPYw)B&da=MZ#8L{a#yO{q-J-i;|6;%SpEl3Z5RG6Vf(Nl!r?C`KP;eUy7qN_S6Luq;nXpL;uOME+(kt0|1UoAeE%d>A z^LdY9#9+{85$9{ZPxX=HADuYNB3(C%WCa^`);HFs^-o?G*gDlZFv9yfpx0P=LRe54 zj6(0ASmv8-waexxvx1u7HKBum+Ve5DCtnkCc@$U?G*pU@%}X*?pjHlIchIQhpDC;c bqpS9t1', views.LocationDetail.as_view(), name='location_detail'), # api/contacts will be routed to the ContactDetail view for handling +] diff --git a/locations_api/views.py b/locations_api/views.py new file mode 100644 index 0000000..469c2e6 --- /dev/null +++ b/locations_api/views.py @@ -0,0 +1,11 @@ +from rest_framework import generics +from .serializers import LocationSerializer +from .models import Location + +class LocationList(generics.ListCreateAPIView): + queryset = Location.objects.all() # tell django how to retrieve all objects from the DB + serializer_class = LocationSerializer # tell django what serializer to use + +class LocationDetail(generics.RetrieveUpdateDestroyAPIView): + queryset = Location.objects.all() + serializer_class = LocationSerializer diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..087e21d --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_rest_api.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()