From e9b41dadab3bc79e653cf454ac63d412a919dd14 Mon Sep 17 00:00:00 2001 From: benjamyn Date: Wed, 14 Oct 2020 19:20:34 -0400 Subject: [PATCH] Initial --- .gitignore | 2 + api/__init__.py | 0 api/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 148 bytes api/__pycache__/admin.cpython-36.pyc | Bin 0 -> 291 bytes api/__pycache__/models.cpython-36.pyc | Bin 0 -> 1808 bytes api/__pycache__/serializers.cpython-36.pyc | Bin 0 -> 1736 bytes api/__pycache__/urls.cpython-36.pyc | Bin 0 -> 535 bytes api/__pycache__/views.cpython-36.pyc | Bin 0 -> 2613 bytes api/admin.py | 5 + api/apps.py | 5 + api/migrations/0001_initial.py | 39 +++++ api/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 1274 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 159 bytes api/models.py | 38 +++++ api/serializers.py | 29 ++++ api/tests.py | 3 + api/urls.py | 13 ++ api/views.py | 65 +++++++++ db.sqlite3 | Bin 0 -> 180224 bytes manage.py | 21 +++ movierater/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 155 bytes .../__pycache__/settings.cpython-36.pyc | Bin 0 -> 2622 bytes movierater/__pycache__/urls.cpython-36.pyc | Bin 0 -> 423 bytes movierater/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 564 bytes movierater/asgi.py | 16 ++ movierater/settings.py | 137 ++++++++++++++++++ movierater/urls.py | 9 ++ movierater/wsgi.py | 16 ++ 30 files changed, 398 insertions(+) create mode 100644 .gitignore create mode 100644 api/__init__.py create mode 100644 api/__pycache__/__init__.cpython-36.pyc create mode 100644 api/__pycache__/admin.cpython-36.pyc create mode 100644 api/__pycache__/models.cpython-36.pyc create mode 100644 api/__pycache__/serializers.cpython-36.pyc create mode 100644 api/__pycache__/urls.cpython-36.pyc create mode 100644 api/__pycache__/views.cpython-36.pyc create mode 100644 api/admin.py create mode 100644 api/apps.py create mode 100644 api/migrations/0001_initial.py create mode 100644 api/migrations/__init__.py create mode 100644 api/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 api/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 api/models.py create mode 100644 api/serializers.py create mode 100644 api/tests.py create mode 100644 api/urls.py create mode 100644 api/views.py create mode 100644 db.sqlite3 create mode 100755 manage.py create mode 100644 movierater/__init__.py create mode 100644 movierater/__pycache__/__init__.cpython-36.pyc create mode 100644 movierater/__pycache__/settings.cpython-36.pyc create mode 100644 movierater/__pycache__/urls.cpython-36.pyc create mode 100644 movierater/__pycache__/wsgi.cpython-36.pyc create mode 100644 movierater/asgi.py create mode 100644 movierater/settings.py create mode 100644 movierater/urls.py create mode 100644 movierater/wsgi.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..151485d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +env/ +.vscode/ diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/__pycache__/__init__.cpython-36.pyc b/api/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ca77bbdce4f1a8c57b8bbc771df0f01decb777a GIT binary patch literal 148 zcmXr!<>fN&Iv>XX1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFGu~1{M=Oiq}05u z#N5g}{eYtUtkmR^V*T9wvdq-@qQsKaB7I*FI|#&dEXdSP1mgJk%)HE!_;|g7%3B;Z Rx%nxjIjMFaql5)`JBvvVIz3fGX{p6X5_x<8!vjn0GX4n z#paE6e_7OQ#65KKK-bW*BDL{099Zpmk=OCXVrlR6WW#XN9hGC_bQt1l8^e_BCRKcC zeKa`cB&bQUPDHj7mRZ8V<_XgWq@jINP`_Zp fV!GN{rK{>=tKGiLE(rHL;<`SWTe1Z^;S2TyoJdP{ literal 0 HcmV?d00001 diff --git a/api/__pycache__/models.cpython-36.pyc b/api/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..330f65af557cd6af5da8e0833f3b8bc06533c892 GIT binary patch literal 1808 zcmZ`(NpB-X6t1e?+ey2AM)S>n;gQZ zUxDC+)0`AEq7-$Ov%-ojqg%OMIFVDhkxR+9gxlPCO}Hay<}IzrhZ&c9FypOe0`8xY zUT_ayNsnr`sJO^$(CnXTA$v?eI!$IjC;3!>NO__v2~%mgJvGAP>(2t^5Jvq1gdh>+ zBx1tKY)(15qmcu;%PpgO4Zz56U_}6j2d_yK@(^IPv~yZrr{ewqJOQS#NM>;^%CVZH z6H3SkhWQvsy!IGIy$?c>jAm>BdAg&wR9OqUq~MSZ!HZL%&z`N_9}<<8W9?PvnHZ^B zyBBG$gwz(?0ioNq$S<@f&93?{B6q>_zh4a|RUroFqRf)wrX0MIl{q~yZe!Rj{jqa3HTwUNsxV#P#GFF$+E}cIy2m4z)Hc{fPO_V2KY)8r2Et~Bx z=u7fz_tsjlg_T)fkXv^3>=&YJ%m8P<+w$uLYpmzw40;E$VnJ490RANAv*$>}BwHxj zAhc7fMAou{i?;0I{0@l7ORj}X#v*c?SWJEz@d(fDtk&0|;>j8XhHBFgWE=kZUK8{? zyEkDYC>*A^E+`9<0rVa<#Z;-v1>iTZus{z0cyU}S8OI;Mbd5bi=)BWhwptlNkNI(2 zCWVM&9mX+~X_}+nj^nFok~b?759{D~lE{-(XA$@Ra%wuF)Yfb zD6kbDWW~V4)JO~ihbh00X<)wX2WEZ*^P6wO`v|5Ul1Vf)qIWFvkX*tyv_d-oEfg)z zmQ=L4wWMRlZ6IC;*za%`*zYb`)a4%cfoeNEfMkZI=)jJkDr0y8gcA3d^m_*cQtx_A z|9T4_Cgu=Ejq$GWaXYfO6WQDX&+fbhM1WTBp9+;|dkXK0>9%2y$&cZbF}8F^V#VY$ z6d!`nJJT|~nu=IeW1%L%&~93CG27Vh%dxicKD@xt%ZHAWpMbU1R~tGZeC(@?zJW&r zH1>x4iSXHQZXJAf(6btbVBzHx5btj}Q}It>dEIW^RqUI7+kGdtrnSP8N{Vz`elKoJ z4`}cB=iXKVsRw4h=F9n`~RLpRzHVPBdLA53%^aDvaW4P zKkS7%;8{|Rt3E$(P<^zrM^&k0dfrc_YSM2WGKrA%{$_&|{kI*`Ktgc%fI~N#n3`wh aEk!qM(Ef{tc3)!0)jkM(7j~`3d;bCb4u>xQ literal 0 HcmV?d00001 diff --git a/api/__pycache__/serializers.cpython-36.pyc b/api/__pycache__/serializers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d3cdcc89f88d100eec7bfa706d84ec917ea077c GIT binary patch literal 1736 zcmb7F%WfMt6eZ`Su{4q$J5GT#FJu*Mq(!ztk)i>ziqORAW)>ZcMM@cY9u7IOYr|bR z+vW@U1O1z;ZoA6497~o22S{eXEAr0e;pO4s)zfab{om_PzvnJv|FV_GL;pFN zE@1={JZA-uIcLHVZtfIr>=s_^Va$Y=`$Z53w(sYyB8)@MUNRAg)(0k9lFzm--M9@; zD7N6)y7F}3X^Rd#ohwfyq660Ne#V-t&rL^5m8E%hE|vbw$>$jVRdtd{6TC_5tehgq z`wda}_1{)UvK-UY#e+>Xn|O?lWHA>kcCaWH4iDQpGB?2_ zley3)l7G}HO^!}eHP!zxbsI6({QqM3t}5j4P?oc_I4g(0s%j?3wH_8ka-z~&s-Yzu zbW8Q~aW+iRkoMwO2FGW{qaB3+)wFuZJ>KT(4!UCph8{WyYQLcAM=&*;@tHGW7yKjt z)2UsIybDM0zo4)S2edgOI$9#A?>C!jRfje=(-|v?Y!dpYS^zUas_mT8s3HJqS>4o@8Lb)-#DoTc7zOiG-aF24jI~V+5gE_XG^O!1Wr7CJY+L#dmW;2#_zRc^D=^oRBq>gP$g&aQ?F}faM74#f z#;>zFm!>169;@uQ&Z^RM%POfRBm!JCZMM@BsnV%c1vy6jV3QWwuewEMm&{UUP0w;e z%#nX7m7tNzsPAo}S(0zUxR3dJghBEOxuWqJE#J=WPE$s{Lhtg%-@^)vQ(C2W>VaHa zInMVtkyhE&5TUj*q`Qf$bpv^Hmft|$j|jUGmiPVCQ6VJBEvTdMsNXd`C3T%l6v_+A z(2*i$O<>E2R`ysaJ#$yg(sEi2##LFX>~N6I>vw~zC|h|RuH)E%n(Fc*%HCIK8ujU# lbbCMSF)B*vCgGUy8P-9?`-%PsbOaOe9Uk$>-HmozUjQ@ieF^{o literal 0 HcmV?d00001 diff --git a/api/__pycache__/urls.cpython-36.pyc b/api/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..939bc9833ec81813b5be008db7e8aa4f0079e11c GIT binary patch literal 535 zcmYjNyH4yd5ViAuE?dAyq#*?@Adqeg7lEK~0SfD3Nr;oxIJqmD+w2eU8~hEmTPl8m zig9=dTRu8-W;~iRdwHHb{e8J!bH-lTuj3IvqNo28NG5s96c?OZ?zE0_g{wT_O|jeh zDi8s2Px@`BA`z)r#3~U9XAm^$hKUTaCYJ$38;3N@Lx_KP1j)o*8G}dJ*@kbNB^O&V zxnM>5Ml-O28^4mO?h40vt7^D6Vcjj-Q37Q`?8gC6zmX4CxF$R4|J86+!}aObV>)tz!hWGOyfBx9? z4C60j?y*6?4^93Cf*Fh?MoN4_P&X4ZwR}tKR$`})@1)eHx^E|y)b(AhJ4rS5d{65% zsik$lo;Li3?pKm#+VWeVyR4eD(*=Ja?f4zt_mV4V*YBoR{j2GszetR)4OV0I=LV~D z8ZVt${xz^PSQ9MGiDelqE!GB0dtzB(3!6s2^8(gy^og>!B^U6ff@cggQ&Cxj#Yigm zS;UVdFC=)cY~=?$TN@SoJS(DMSVVb-AB97$nX2`Tobz&~+_fahkJhqd80J3V@-WXN ze?f3kQ#s$|5M0qG5GdR0TdJiEn_NU;5}k0N+NEpG(!_<%`a@j*%Ll{WhbDUCPVG>Fys%Y*Ua*;+-Ldi-qm%kWd z1zcMEeQ$L?Px=>uIE@yu}Fak3ocf5eV`^>tQ|(HAvC=^gTrI70FfHd zBn9CTkJv=pE>viW+j}tR-zvmwP^UU?Fv83|!mM+XRhYx*b8<%fCbOY_uBz+hObWQA z?2X5pTZkOSi!e%5CFR9_&gA;gg4yuFLe!u=fF^$j!N{1z#sL+-79=)fYiu&}oSa%{ zWn|enwL!B_o#RJ^qy0`y$5u>nL8o+Vk7-aD)7U*Th*4C>l-bMyPleHO1tL^_GEd#Y z8@oj4mSo*L|HWBGn=?joK`uG6M?ISXT~^Mj%tn zh(RUn5nw?%dI!G(tDT0~@kz4;b#MES!A{~hsFal99#BDWIZBE?5x7%*OS}ayaT7%k z#Prh#g5#&+Z8UcEq`lpUC#)y<(@`WKYD?J=J`{EQ_$mlx?Eyq}K*Wi76GaalwhW(f z(ZW6)bcUW=)gEnaZ3MS(-3lImtLRWqsJhyC7mQ!5eHlD?`2F@n*zzhw;K{D4;N)Bu z$~-)nEm}_rnQ4+MZ^jPgLbm!qn9)F7#|3$ac3>cY`x^A+yC4kHGn)WwYMP`=C~--h zn9y&6PC+kwZObJmOY^uK%wqM)dcP$)5KCM^(M2(>k66U+5{f1YoLL~5)M9wy#Cu6! z;o^v86crSAP)rG3YM73A0|d@0ajue@ux7JPwC4gr@p!q9Lq7uX-vmW^J~#XZvzQI< zCUXFXR5eP3O_({vp!hh@5Lb_(Nz4{M2Qb@(F}9I_NGk|nub05O@gU6JDS9J~(_XoO zy(Bu|y<$I{1L+hr;(Z9(cf<$q5(5y*4#l2S^xz2J;x^i671Dc6%kZCqOXA`T*x8fr zg#-rWkpD3cf!iTIM)8Uq#CzcQ9NKFWDCzSG^l2s{JLk}+i8w`{xQpHy)IPy3PB>Rc zT~ZCT55a-$64YE07$6vYRpIw%+%w6B1 zOP5ALw>&=(fr?JD(2T~ys@m+ZktL~hZSk7+;qro-R52jDrl&k+vPz5*v&l6N;y$TjVr?w;8t*+8 z=}&2uUy%R@-!&bdQTeeyhvy?8g?g9p%GajNz3-}b88#uHg^FlX=qt=(TZ z?5)g*`}?p@C_U2d0ZBOz`ftm|A)%@A;sJoXar+JA%7N)3eB~*ep9}|KEzn6wrL4sMN=DGt|&ZHqOyQWh-{SOLX3#V(fyk_Iy^l5 zELcN0ES9pG0GC$z5ebJ|X3w%1=Y7^=eY4R%Vf*Yu((BlPOQTj_d^pRqiyCTw_s$}5 zct1<>Q_88`wG*Z_WewH`cgA7!sTkgZP*=IXa-)4&C2}4&Bk`nSzH~@*nZvf2WBvnG CpL3%C literal 0 HcmV?d00001 diff --git a/api/migrations/__pycache__/__init__.cpython-36.pyc b/api/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3618cb21f50720e8b564d074b14ca27d8fa04c50 GIT binary patch literal 159 zcmXr!<>fN&Iv>XX1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFCYDk{M=Oiq}05u z#N5g}{eYtUtkmR^V*T9wvdq-@qQsKaB7I*FI|#&dEXdSP1mfJxbf8pbeqOPDe0*kJ bW=VX!UP0w84x8Nkl+v73JCH5KK+FID;%F({ literal 0 HcmV?d00001 diff --git a/api/models.py b/api/models.py new file mode 100644 index 0000000..f4203eb --- /dev/null +++ b/api/models.py @@ -0,0 +1,38 @@ +from django.db import models +from django.contrib.auth.models import User +from django.core.validators import MaxValueValidator, MinValueValidator + + +class Movie(models.Model): + title = models.CharField(max_length=32) + description = models.TextField(max_length=360) + + def no_of_ratings(self): + ratings = Rating.objects.filter(movie=self) + return len(ratings) + + def average_ratings(self): + ratings = Rating.objects.filter(movie=self) + average = 0 + for rating in ratings: + average += rating.stars + if len(ratings) > 0: + return average / len(ratings) + return 0 + + def __str__(self): + return self.title + + +class Rating(models.Model): + movie = models.ForeignKey(Movie, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) + stars = models.IntegerField( + validators=[MinValueValidator(1), MaxValueValidator(5)]) + + class Meta: + unique_together = (('user'), 'movie') + index_together = (('user'), 'movie') + + def __str__(self): + return f"{self.movie.title} - {self.stars}" diff --git a/api/serializers.py b/api/serializers.py new file mode 100644 index 0000000..4cd1064 --- /dev/null +++ b/api/serializers.py @@ -0,0 +1,29 @@ +from rest_framework import serializers +from .models import Movie, Rating +from django.contrib.auth.models import User +from rest_framework.authtoken.models import Token + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["id", "username", "password"] + extra_kwargs = {'password': {'write_only': True, 'required': True}} + + def create(self, validated_data): + user = User.objects.create_user(**validated_data) + Token.objects.create(user=user) + return user + + +class MovieSerializer(serializers.ModelSerializer): + class Meta: + model = Movie + fields = ["id", "title", "description", + "no_of_ratings", "average_ratings"] + + +class RatingSerializer(serializers.ModelSerializer): + class Meta: + model = Rating + fields = ["id", "stars", "user", "movie"] diff --git a/api/tests.py b/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/api/urls.py b/api/urls.py new file mode 100644 index 0000000..ebebfc5 --- /dev/null +++ b/api/urls.py @@ -0,0 +1,13 @@ +from django.contrib import admin +from django.urls import path, include +from rest_framework import routers +from .views import MovieViewSet, RatingViewSet, UserViewSet + +router = routers.DefaultRouter() +router.register('movies', MovieViewSet) +router.register('ratings', RatingViewSet) +router.register('users', UserViewSet) + +urlpatterns = [ + path('', include(router.urls)), +] diff --git a/api/views.py b/api/views.py new file mode 100644 index 0000000..d180b35 --- /dev/null +++ b/api/views.py @@ -0,0 +1,65 @@ +from django.contrib.auth.models import User +from django.shortcuts import render +from rest_framework import status, viewsets +from rest_framework.authentication import TokenAuthentication +from rest_framework.decorators import action +from rest_framework.permissions import IsAuthenticated, AllowAny +from rest_framework.response import Response + +from .models import Movie, Rating +from .serializers import MovieSerializer, RatingSerializer, UserSerializer + + +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + permission_classes = (AllowAny,) + +class MovieViewSet(viewsets.ModelViewSet): + queryset = Movie.objects.all() + serializer_class = MovieSerializer + authentication_classes = (TokenAuthentication,) + permission_classes = (IsAuthenticated,) + + @action(detail=True, methods=['POST']) + def rate_movie(self, request, pk=None): + if 'stars' in request.data: + + movie = Movie.objects.get(id=pk) + stars = request.data['stars'] + user = request.user + + try: + rating = Rating.objects.get(user=user.id, movie=movie.id) + rating.stars = stars + rating.save() + serializer = RatingSerializer(rating, many=False) + response = {'message': f"Rating Updated", + "result": serializer.data} + return Response(response, status=status.HTTP_200_OK) + except: + rating = Rating.objects.create( + user=user, movie=movie, stars=stars) + serializer = RatingSerializer(rating, many=False) + response = {'message': f"Rating Created", + "result": serializer.data} + return Response(response, status=status.HTTP_200_OK) + + else: + response = {'message': "stars field required"} + return Response(response, status=status.HTTP_400_BAD_REQUEST) + + +class RatingViewSet(viewsets.ModelViewSet): + queryset = Rating.objects.all() + serializer_class = RatingSerializer + authentication_classes = (TokenAuthentication,) + permission_classes = (IsAuthenticated,) + + def update(self, request, *args, **kwargs): + response = {'message': "Can't update rating like that"} + return Response(response, status=status.HTTP_400_BAD_REQUEST) + + def create(self, request, *args, **kwargs): + response = {'message': "Can't update rating like that"} + return Response(response, status=status.HTTP_400_BAD_REQUEST) diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..65d3cd6379add4b255874902522f3c131e03caaa GIT binary patch literal 180224 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 NP~=Yq^on9A^gkFCMxFow literal 0 HcmV?d00001 diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..afd9e0e --- /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', 'movierater.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/movierater/__init__.py b/movierater/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/movierater/__pycache__/__init__.cpython-36.pyc b/movierater/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..216454b4e8defb7a5cf7f2f487c94a472b027625 GIT binary patch literal 155 zcmXr!<>ivXX1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFAx2U{M=Oiq}05u z#N5g}{eYtUtkmR^V*T9wvdq-@qQsKaB7I*FI|#&dEXah&KqTVhGxIV_;^XxSDsOSv Rg#{TmvT&=M$#Qf5+1;$%P7PsdsgPkc&-mzF_kEsHoUhbFp7Z4zZr7Uj?+%A+ZC z1x=$FbhVq;@@N)aL)Xy_G>7KVO?0c9)27gZb_Lz;CJ=`f(H(RbeTTm9awLg<_`(6! zG~%@xbPxR)`MruW=>De^`squGB(+)e06m50HMEQ#g2gggiQ3hueMFL7PP>jCYd6rE zHV4to!+jI(TS(9r(1vy!rIf_VGeb-!68U1^u)7XVF=NE;QoiGOyyYAc>=_Juyz4oA z+-5>Pzl-fihWOSozl=p4i~QG8l1e z9{#LHz$Y>BV+aA~dyKjCl_(;oO@*P4lL*?5C1P6yK#@5vX;bkeW^oA5dYJDFOp`YW zWxUflo0DN9aD<7+9~$NW)Boek!=0F;f1x%KRsSiaORFzGdRu*?`+l|8HxITq*!JMC zxAffYEVmb%;9*irq-Ct)gH3Y%O0+;D0_+p(EPT0)dY|Him< zzZ%b z!@`huRNFDb@wuL?MclYDT%VZL<^^*#N&BF0v=4w^!f!j_I@R2eNbwn6JtMC$@J#B9 zBOrz?*91-rEkM9FI^ma4jHs-RhN*TvDzT4D2j;aQF36bwa2({kj(~7$(Dhd@q3Pid zz(VFf8tIrpRTtE;72 zRq^k{GIm6}L@-SimZHH9V3{FJ&Oz(ER<-hpfK{Xu<`hNV>yUw&^0Ip zz9JnqH-e(Dg(k(G#KOI0z_3CrVj3Y8-wib!&;RAJNEKoeYhabJ-DSNq`(H0>KV)Wo z6yq7d>&pUE2Nw27`#iz~w$}!*{WR5rpA+E>0`7@lXTu`|P7u>+8)na;?CbnUa=QJ# z+E`y-9~Wp{w)0p}X52h~A58)z70 zjTVh0Ib9DoQ(f0`ZzM$yOD)JNa-kus`dj(;V4^6$Y3>HoQn_5)my7ydO;MF#rc_l_ z5P<;dQwj2wQn6T;_oap$Txry5s@`mr3$^M_FsaIwdRbCsC79h;c1xjtxm1wCQVzJj zL+oI(D5+BDT+wD4vZCrc4JgF@TH|f7AT`xJy$;m}uSNZxR4##X4R|qKma4l=X;;<@ zwW17eN)=hxYEZ_xCQPIB~wD|(y=(R=(ieKN~E2(n1 zq^N%;y!&Ae!{+Or*mEo_wy@ndtYcfO4?ixb7%@#QKRzUv3`d3oC&#_u z9tXLfEe8!u{7bktv;z&7%BAmSxipu`WKzlTE5m&&$)vfVBy}R6$#B`QKR1y|W+pS~ R@XF`7)ac4^Tq2oB{s*iTZ3_SZ literal 0 HcmV?d00001 diff --git a/movierater/__pycache__/urls.cpython-36.pyc b/movierater/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7afabdc4895509db7c48a7bb2903adab5b38be41 GIT binary patch literal 423 zcmYjOu};G<5VaF0P1_W~53py62UdhYVg*&OWgv2E(GzixS|64gmKxZBJyO*+}e*Cwd{H> zpmL@cjy0-gy<68#Z-hFegP0x&+cxx&0hYb#>>&vndS6Vc6W%hl(&bVsXPSkHV2Ypq zC4<()kTC?HIyb_)`q?lkcG_&pU^2`pUmCHqCcJ3ye1N7=J)KfioW5c-AozBHcS#N|$65on1-BCtx9 zN!(L~>vWkW2$E`09f*NAxX1C9-lOHAzzZ}!ybIaq#dJmrqt~(|Yhy`mwh}D&U`b<5 z1%=PEY~~4kZHxm){02zh!48=?Z+2nys!#s)C=$E24Dbj) H#E