From 2d12da1bb8f299c6e7a40f7ea0c38cd3aa28051b Mon Sep 17 00:00:00 2001 From: Olly Hearn Date: Fri, 12 May 2023 23:48:12 +0300 Subject: [PATCH] aaAa --- backend/custom_auth/urls.py | 3 +- backend/custom_auth/views.py | 42 +- backend/db.sqlite3 | Bin 172032 -> 172032 bytes backend_legacy/backend/__init__.py | 0 backend_legacy/backend/admin.py | 21 - backend_legacy/backend/asgi.py | 16 - .../backend/migrations/0001_initial.py | 695 ------------------ backend_legacy/backend/migrations/__init__.py | 0 backend_legacy/backend/models.py | 69 -- backend_legacy/backend/permissions.py | 26 - backend_legacy/backend/serializers.py | 39 - backend_legacy/backend/settings.py | 125 ---- backend_legacy/backend/urls.py | 12 - backend_legacy/backend/views.py | 41 -- backend_legacy/backend/wsgi.py | 16 - backend_legacy/db.sqlite3 | Bin 159744 -> 0 bytes backend_legacy/manage.py | 22 - frontend/src/App.js | 6 +- frontend/src/components/LoginForm.jsx | 23 +- frontend/src/components/MainCard.jsx | 2 +- frontend/src/context/AuthContext.jsx | 18 +- 21 files changed, 77 insertions(+), 1099 deletions(-) delete mode 100644 backend_legacy/backend/__init__.py delete mode 100644 backend_legacy/backend/admin.py delete mode 100644 backend_legacy/backend/asgi.py delete mode 100644 backend_legacy/backend/migrations/0001_initial.py delete mode 100644 backend_legacy/backend/migrations/__init__.py delete mode 100644 backend_legacy/backend/models.py delete mode 100644 backend_legacy/backend/permissions.py delete mode 100644 backend_legacy/backend/serializers.py delete mode 100644 backend_legacy/backend/settings.py delete mode 100644 backend_legacy/backend/urls.py delete mode 100644 backend_legacy/backend/views.py delete mode 100644 backend_legacy/backend/wsgi.py delete mode 100644 backend_legacy/db.sqlite3 delete mode 100755 backend_legacy/manage.py diff --git a/backend/custom_auth/urls.py b/backend/custom_auth/urls.py index 595b9c5..2f21f6c 100644 --- a/backend/custom_auth/urls.py +++ b/backend/custom_auth/urls.py @@ -3,5 +3,6 @@ from custom_auth import views urlpatterns = [ path('', include('rest_framework.urls')), - path('token/', views.CustomAuthToken.as_view()) + path('token/', views.CustomAuthToken.as_view()), + path('register/', views.RegisterView.as_view()) ] diff --git a/backend/custom_auth/views.py b/backend/custom_auth/views.py index 6b84a85..45d3b9d 100644 --- a/backend/custom_auth/views.py +++ b/backend/custom_auth/views.py @@ -1,10 +1,13 @@ from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response +from rest_framework.request import Request +from rest_framework.views import APIView +from django.contrib.auth.models import User class CustomAuthToken(ObtainAuthToken): - def post(self, request, *args, **kwargs): + def post(self, request: Request, *args, **kwargs): serializer = self.serializer_class(data=request.data, context={'request': request}) serializer.is_valid(raise_exception=True) @@ -13,5 +16,40 @@ class CustomAuthToken(ObtainAuthToken): return Response({ 'token': token.key, 'user_id': user.pk, - 'email': user.email + 'username': user.username }) + + +class RegisterView(APIView): + + def get(self, request: Request, *args, **kwargs): + username = request.data.get("username", None) + if not username: + return Response({"message": "Username must not be empty"}, status=406) + if User.objects.filter(username=username).exists(): + return Response({"message": "Username already taken"}, status=409) + return Response({"message": "Username availiable"}, status=200) + + def post(self, request: Request, *args, **kwargs): + username = request.data.get("username") + if not username: + return Response({"message": "Username must not be empty"}, status=406) + if User.objects.filter(username=username).exists(): + return Response({"message": "Username already taken"}, status=409) + password = request.data.get("password", None) + if not password: + return Response({"message": "Password must not be empty"}, status=406) + try: + user = User.objects.create_user( + is_superuser=False, + username=username, + password=password + ) + token, created = Token.objects.get_or_create(user=user) + return Response({ + 'token': token.key, + 'user_id': user.pk, + 'username': user.username + }, status=200) + except Exception as e: + return Response({"message": "Something went wrong, registration is not completed", "error": e}, status=500) diff --git a/backend/db.sqlite3 b/backend/db.sqlite3 index 9c0fb25f3686fbab3a47ba6d4685c2f7223ff12c..719fa6c5a3a15729b7ac88ffbb9bbaa4c1175552 100644 GIT binary patch delta 1612 zcma)6&uiOO9GCj!Q73a>x>34zqwPv48<}0{Jw5#}bfCnl9VfQqxON;v$Rt1cw;B{YiE4L@Ez0F2GeP@o1-2CV~3wDh2tFL*E1Ay5Z@0Qp%hd-SU@bHMka6X-Z z3rBAH?)vmWpZKQw9*>XdUtkWO@c9mVHQ&y_KGqA(CbP3nYE`o$xlT-oURvH-jV(^k zTl{iaNNiLQUJ18wanY#KT)naqjtVxl3#nQo-AykEvqf9E&?wu*b_?+c`+4FQ&>2Aq ziYUmd0afB9N$Q{GM!edXw_#Rk0j;-61|mD(+1_4w7RNWDxs}5(&?zQ>{>Dt5P-e zXf)Akx1wmFu(-aJNQ9lB(CB2-%fYBDq{?&t_GZ)3SEblRW4oza$)fEPGMKLjURc;3JBFlDUdE0QOvu%<;Mtg{(`ri{xkJoi5lf<=NNuM=%M~h@@rJO~*#Tb+ zJQr*0NTK>gHxV(<*nGjZGzki|tE#q?NbBdHn_21E&>)1%_d# z2mLeb@c!rTvl9SbXW%Y;0I$1le*&Y^AjZB-5EvD`%v^5x;OqDHT>Qrj{1g5T9}kaS z`5B(}0G8#zv-=?quwHJ$O%i}l82FbPxhHPXuh7E*FAH{`e$V=*TmU}z0rp%Ku`}3cOzy}0(k%*q~p%IXpm#8WWqDqNn3hrg*4b^bhs3BRr zY4CZ=eJLnopz^_qR)ZoRP>|r}h`Y$TNM4Glk|zq~u|Z^kn35=25>aJBrGiC71DU4F zpgu<$0m(rk1PKoCiaSPO-=Qu8zl2?QZ_uy7-Undqm3sxF;#ckG&I3 delta 592 zcmaixzmL*z0LA+)_178rayn?#C}-5@Q0NbO{Ma~t9|s&l5xOXp-;}mUDYOfq|A6LV zZqu+hc!MEL?25VB>Bc*wxsC0Xi-RVLw;R`&_wrsoZ#-Wa&sSdE1kCGOLBLF(xd6IT zauv^`*DMwq?5;JyRpY?rBrYQeg4(7COxUKg$s3z76>oqm1nD5x{RHhNDW`{^y!86c z7s-9*g$o2O;16SU{1qCD(RKToYBdqtq1BvC_N=29Yv{S;%S@nDl9`$&G#i4Vw>#dl z-shY2kWqP^7HSoRa8@^m`Bt)*9y9~&Mh%ZB*{CErAl}^E1@%7t5 zADz}if*S5@luN!ww9rc=nXnY@*EB7d?r@YA8w9F!wNxF+N}sV%CH*K~2v+YU-mw##Mst+<@uuHg#7`yS+@e3pqM#QM_$K@k*< z6AVsK4wCYdOQ3|4q1|q`$2ffZ2wX&=iNGUh8msaiynoM<1plLk8b===o-Bi>2>c08 zmp?4v?#Vk8yMUpX1zf`3J5c+lIl$~o4~M|dkef|X(B!^>4}Yb71RlfvWuFP}+_nV3 SzZatB@o#WfHn8u%Tz>!%k-C@w diff --git a/backend_legacy/backend/__init__.py b/backend_legacy/backend/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/backend_legacy/backend/admin.py b/backend_legacy/backend/admin.py deleted file mode 100644 index 9830367..0000000 --- a/backend_legacy/backend/admin.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.contrib import admin -from backend.models import Snippet, SnippetParticipant - -class SnippetAdmin(admin.ModelAdmin): - list_display = ('id', 'title', 'created') - list_display_links = ('id', 'title') - search_fields = ('title',) - list_filter = ('created',) - ordering = ('-created',) - - -class SnippetParticipantAdmin(admin.ModelAdmin): - list_display = ('id', 'user', "snippet") - list_display_links = ('id', 'user', "snippet") - search_fields = ('user', "snippet") - list_filter = ('id',) - ordering = ('-id',) - - -admin.site.register(Snippet, SnippetAdmin) -admin.site.register(SnippetParticipant, SnippetParticipantAdmin) diff --git a/backend_legacy/backend/asgi.py b/backend_legacy/backend/asgi.py deleted file mode 100644 index 023dea8..0000000 --- a/backend_legacy/backend/asgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -ASGI config for backend 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/4.1/howto/deployment/asgi/ -""" - -import os - -from django.core.asgi import get_asgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") - -application = get_asgi_application() diff --git a/backend_legacy/backend/migrations/0001_initial.py b/backend_legacy/backend/migrations/0001_initial.py deleted file mode 100644 index 0ff148a..0000000 --- a/backend_legacy/backend/migrations/0001_initial.py +++ /dev/null @@ -1,695 +0,0 @@ -# Generated by Django 4.1.5 on 2023-05-01 12:33 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name="Snippet", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("created", models.DateTimeField(auto_now_add=True)), - ("title", models.CharField(blank=True, default="", max_length=100)), - ("content", models.TextField()), - ("linenos", models.BooleanField(default=False)), - ( - "language", - models.CharField( - choices=[ - ("abap", "ABAP"), - ("abnf", "ABNF"), - ("actionscript", "ActionScript"), - ("actionscript3", "ActionScript 3"), - ("ada", "Ada"), - ("adl", "ADL"), - ("agda", "Agda"), - ("aheui", "Aheui"), - ("alloy", "Alloy"), - ("ambienttalk", "AmbientTalk"), - ("amdgpu", "AMDGPU"), - ("ampl", "Ampl"), - ("ansys", "ANSYS parametric design language"), - ("antlr", "ANTLR"), - ("antlr-actionscript", "ANTLR With ActionScript Target"), - ("antlr-cpp", "ANTLR With CPP Target"), - ("antlr-csharp", "ANTLR With C# Target"), - ("antlr-java", "ANTLR With Java Target"), - ("antlr-objc", "ANTLR With ObjectiveC Target"), - ("antlr-perl", "ANTLR With Perl Target"), - ("antlr-python", "ANTLR With Python Target"), - ("antlr-ruby", "ANTLR With Ruby Target"), - ("apacheconf", "ApacheConf"), - ("apl", "APL"), - ("applescript", "AppleScript"), - ("arduino", "Arduino"), - ("arrow", "Arrow"), - ("asc", "ASCII armored"), - ("aspectj", "AspectJ"), - ("aspx-cs", "aspx-cs"), - ("aspx-vb", "aspx-vb"), - ("asymptote", "Asymptote"), - ("augeas", "Augeas"), - ("autohotkey", "autohotkey"), - ("autoit", "AutoIt"), - ("awk", "Awk"), - ("bare", "BARE"), - ("basemake", "Base Makefile"), - ("bash", "Bash"), - ("batch", "Batchfile"), - ("bbcbasic", "BBC Basic"), - ("bbcode", "BBCode"), - ("bc", "BC"), - ("bdd", "Bdd"), - ("befunge", "Befunge"), - ("berry", "Berry"), - ("bibtex", "BibTeX"), - ("blitzbasic", "BlitzBasic"), - ("blitzmax", "BlitzMax"), - ("bnf", "BNF"), - ("boa", "Boa"), - ("boo", "Boo"), - ("boogie", "Boogie"), - ("brainfuck", "Brainfuck"), - ("bst", "BST"), - ("bugs", "BUGS"), - ("c", "C"), - ("c-objdump", "c-objdump"), - ("ca65", "ca65 assembler"), - ("cadl", "cADL"), - ("camkes", "CAmkES"), - ("capdl", "CapDL"), - ("capnp", "Cap'n Proto"), - ("cbmbas", "CBM BASIC V2"), - ("cddl", "CDDL"), - ("ceylon", "Ceylon"), - ("cfc", "Coldfusion CFC"), - ("cfengine3", "CFEngine3"), - ("cfm", "Coldfusion HTML"), - ("cfs", "cfstatement"), - ("chaiscript", "ChaiScript"), - ("chapel", "Chapel"), - ("charmci", "Charmci"), - ("cheetah", "Cheetah"), - ("cirru", "Cirru"), - ("clay", "Clay"), - ("clean", "Clean"), - ("clojure", "Clojure"), - ("clojurescript", "ClojureScript"), - ("cmake", "CMake"), - ("cobol", "COBOL"), - ("cobolfree", "COBOLFree"), - ("coffeescript", "CoffeeScript"), - ("comal", "COMAL-80"), - ("common-lisp", "Common Lisp"), - ("componentpascal", "Component Pascal"), - ("console", "Bash Session"), - ("coq", "Coq"), - ("cplint", "cplint"), - ("cpp", "C++"), - ("cpp-objdump", "cpp-objdump"), - ("cpsa", "CPSA"), - ("cr", "Crystal"), - ("crmsh", "Crmsh"), - ("croc", "Croc"), - ("cryptol", "Cryptol"), - ("csharp", "C#"), - ("csound", "Csound Orchestra"), - ("csound-document", "Csound Document"), - ("csound-score", "Csound Score"), - ("css", "CSS"), - ("css+django", "CSS+Django/Jinja"), - ("css+genshitext", "CSS+Genshi Text"), - ("css+lasso", "CSS+Lasso"), - ("css+mako", "CSS+Mako"), - ("css+mako", "CSS+Mako"), - ("css+mozpreproc", "CSS+mozpreproc"), - ("css+myghty", "CSS+Myghty"), - ("css+php", "CSS+PHP"), - ("css+ruby", "CSS+Ruby"), - ("css+smarty", "CSS+Smarty"), - ("css+ul4", "CSS+UL4"), - ("cuda", "CUDA"), - ("cypher", "Cypher"), - ("cython", "Cython"), - ("d", "D"), - ("d-objdump", "d-objdump"), - ("dart", "Dart"), - ("dasm16", "DASM16"), - ("debcontrol", "Debian Control file"), - ("debsources", "Debian Sourcelist"), - ("delphi", "Delphi"), - ("devicetree", "Devicetree"), - ("dg", "dg"), - ("diff", "Diff"), - ("django", "Django/Jinja"), - ("docker", "Docker"), - ("doscon", "MSDOS Session"), - ("dpatch", "Darcs Patch"), - ("dtd", "DTD"), - ("duel", "Duel"), - ("dylan", "Dylan"), - ("dylan-console", "Dylan session"), - ("dylan-lid", "DylanLID"), - ("earl-grey", "Earl Grey"), - ("easytrieve", "Easytrieve"), - ("ebnf", "EBNF"), - ("ec", "eC"), - ("ecl", "ECL"), - ("eiffel", "Eiffel"), - ("elixir", "Elixir"), - ("elm", "Elm"), - ("elpi", "Elpi"), - ("emacs-lisp", "EmacsLisp"), - ("email", "E-mail"), - ("erb", "ERB"), - ("erl", "Erlang erl session"), - ("erlang", "Erlang"), - ("evoque", "Evoque"), - ("execline", "execline"), - ("extempore", "xtlang"), - ("ezhil", "Ezhil"), - ("factor", "Factor"), - ("fan", "Fantom"), - ("fancy", "Fancy"), - ("felix", "Felix"), - ("fennel", "Fennel"), - ("fish", "Fish"), - ("flatline", "Flatline"), - ("floscript", "FloScript"), - ("forth", "Forth"), - ("fortran", "Fortran"), - ("fortranfixed", "FortranFixed"), - ("foxpro", "FoxPro"), - ("freefem", "Freefem"), - ("fsharp", "F#"), - ("fstar", "FStar"), - ("futhark", "Futhark"), - ("gap", "GAP"), - ("gas", "GAS"), - ("gcode", "g-code"), - ("gdscript", "GDScript"), - ("genshi", "Genshi"), - ("genshitext", "Genshi Text"), - ("gherkin", "Gherkin"), - ("glsl", "GLSL"), - ("gnuplot", "Gnuplot"), - ("go", "Go"), - ("golo", "Golo"), - ("gooddata-cl", "GoodData-CL"), - ("gosu", "Gosu"), - ("graphviz", "Graphviz"), - ("groff", "Groff"), - ("groovy", "Groovy"), - ("gsql", "GSQL"), - ("gst", "Gosu Template"), - ("haml", "Haml"), - ("handlebars", "Handlebars"), - ("haskell", "Haskell"), - ("haxe", "Haxe"), - ("haxeml", "Hxml"), - ("hexdump", "Hexdump"), - ("hlsl", "HLSL"), - ("hsail", "HSAIL"), - ("hspec", "Hspec"), - ("html", "HTML"), - ("html+cheetah", "HTML+Cheetah"), - ("html+django", "HTML+Django/Jinja"), - ("html+evoque", "HTML+Evoque"), - ("html+genshi", "HTML+Genshi"), - ("html+handlebars", "HTML+Handlebars"), - ("html+lasso", "HTML+Lasso"), - ("html+mako", "HTML+Mako"), - ("html+mako", "HTML+Mako"), - ("html+myghty", "HTML+Myghty"), - ("html+ng2", "HTML + Angular2"), - ("html+php", "HTML+PHP"), - ("html+smarty", "HTML+Smarty"), - ("html+twig", "HTML+Twig"), - ("html+ul4", "HTML+UL4"), - ("html+velocity", "HTML+Velocity"), - ("http", "HTTP"), - ("hybris", "Hybris"), - ("hylang", "Hy"), - ("i6t", "Inform 6 template"), - ("icon", "Icon"), - ("idl", "IDL"), - ("idris", "Idris"), - ("iex", "Elixir iex session"), - ("igor", "Igor"), - ("inform6", "Inform 6"), - ("inform7", "Inform 7"), - ("ini", "INI"), - ("io", "Io"), - ("ioke", "Ioke"), - ("ipython2", "IPython"), - ("ipython3", "IPython3"), - ("ipythonconsole", "IPython console session"), - ("irc", "IRC logs"), - ("isabelle", "Isabelle"), - ("j", "J"), - ("jags", "JAGS"), - ("jasmin", "Jasmin"), - ("java", "Java"), - ("javascript", "JavaScript"), - ("javascript+cheetah", "JavaScript+Cheetah"), - ("javascript+django", "JavaScript+Django/Jinja"), - ("javascript+lasso", "JavaScript+Lasso"), - ("javascript+mako", "JavaScript+Mako"), - ("javascript+mozpreproc", "Javascript+mozpreproc"), - ("javascript+myghty", "JavaScript+Myghty"), - ("javascript+php", "JavaScript+PHP"), - ("javascript+ruby", "JavaScript+Ruby"), - ("javascript+smarty", "JavaScript+Smarty"), - ("jcl", "JCL"), - ("jlcon", "Julia console"), - ("jmespath", "JMESPath"), - ("js+genshitext", "JavaScript+Genshi Text"), - ("js+mako", "JavaScript+Mako"), - ("js+ul4", "Javascript+UL4"), - ("jsgf", "JSGF"), - ("jslt", "JSLT"), - ("json", "JSON"), - ("jsonld", "JSON-LD"), - ("jsp", "Java Server Page"), - ("julia", "Julia"), - ("juttle", "Juttle"), - ("k", "K"), - ("kal", "Kal"), - ("kconfig", "Kconfig"), - ("kmsg", "Kernel log"), - ("koka", "Koka"), - ("kotlin", "Kotlin"), - ("kuin", "Kuin"), - ("lasso", "Lasso"), - ("lean", "Lean"), - ("less", "LessCss"), - ("lighttpd", "Lighttpd configuration file"), - ("lilypond", "LilyPond"), - ("limbo", "Limbo"), - ("liquid", "liquid"), - ("literate-agda", "Literate Agda"), - ("literate-cryptol", "Literate Cryptol"), - ("literate-haskell", "Literate Haskell"), - ("literate-idris", "Literate Idris"), - ("livescript", "LiveScript"), - ("llvm", "LLVM"), - ("llvm-mir", "LLVM-MIR"), - ("llvm-mir-body", "LLVM-MIR Body"), - ("logos", "Logos"), - ("logtalk", "Logtalk"), - ("lsl", "LSL"), - ("lua", "Lua"), - ("macaulay2", "Macaulay2"), - ("make", "Makefile"), - ("mako", "Mako"), - ("mako", "Mako"), - ("maql", "MAQL"), - ("markdown", "Markdown"), - ("mask", "Mask"), - ("mason", "Mason"), - ("mathematica", "Mathematica"), - ("matlab", "Matlab"), - ("matlabsession", "Matlab session"), - ("maxima", "Maxima"), - ("mcfunction", "MCFunction"), - ("meson", "Meson"), - ("mime", "MIME"), - ("minid", "MiniD"), - ("miniscript", "MiniScript"), - ("modelica", "Modelica"), - ("modula2", "Modula-2"), - ("monkey", "Monkey"), - ("monte", "Monte"), - ("moocode", "MOOCode"), - ("moonscript", "MoonScript"), - ("mosel", "Mosel"), - ("mozhashpreproc", "mozhashpreproc"), - ("mozpercentpreproc", "mozpercentpreproc"), - ("mql", "MQL"), - ("mscgen", "Mscgen"), - ("mupad", "MuPAD"), - ("mxml", "MXML"), - ("myghty", "Myghty"), - ("mysql", "MySQL"), - ("nasm", "NASM"), - ("ncl", "NCL"), - ("nemerle", "Nemerle"), - ("nesc", "nesC"), - ("nestedtext", "NestedText"), - ("newlisp", "NewLisp"), - ("newspeak", "Newspeak"), - ("ng2", "Angular2"), - ("nginx", "Nginx configuration file"), - ("nimrod", "Nimrod"), - ("nit", "Nit"), - ("nixos", "Nix"), - ("nodejsrepl", "Node.js REPL console session"), - ("notmuch", "Notmuch"), - ("nsis", "NSIS"), - ("numpy", "NumPy"), - ("nusmv", "NuSMV"), - ("objdump", "objdump"), - ("objdump-nasm", "objdump-nasm"), - ("objective-c", "Objective-C"), - ("objective-c++", "Objective-C++"), - ("objective-j", "Objective-J"), - ("ocaml", "OCaml"), - ("octave", "Octave"), - ("odin", "ODIN"), - ("omg-idl", "OMG Interface Definition Language"), - ("ooc", "Ooc"), - ("opa", "Opa"), - ("openedge", "OpenEdge ABL"), - ("output", "Text output"), - ("pacmanconf", "PacmanConf"), - ("pan", "Pan"), - ("parasail", "ParaSail"), - ("pawn", "Pawn"), - ("peg", "PEG"), - ("perl", "Perl"), - ("perl6", "Perl6"), - ("php", "PHP"), - ("pig", "Pig"), - ("pike", "Pike"), - ("pkgconfig", "PkgConfig"), - ("plpgsql", "PL/pgSQL"), - ("pointless", "Pointless"), - ("pony", "Pony"), - ("postgresql", "PostgreSQL SQL dialect"), - ("postscript", "PostScript"), - ("pot", "Gettext Catalog"), - ("pov", "POVRay"), - ("powershell", "PowerShell"), - ("praat", "Praat"), - ("procfile", "Procfile"), - ("prolog", "Prolog"), - ("promql", "PromQL"), - ("properties", "Properties"), - ("protobuf", "Protocol Buffer"), - ("psql", "PostgreSQL console (psql)"), - ("psysh", "PsySH console session for PHP"), - ("pug", "Pug"), - ("puppet", "Puppet"), - ("pwsh-session", "PowerShell Session"), - ("py+ul4", "Python+UL4"), - ("py2tb", "Python 2.x Traceback"), - ("pycon", "Python console session"), - ("pypylog", "PyPy Log"), - ("pytb", "Python Traceback"), - ("python", "Python"), - ("python2", "Python 2.x"), - ("q", "Q"), - ("qbasic", "QBasic"), - ("qlik", "Qlik"), - ("qml", "QML"), - ("qvto", "QVTO"), - ("racket", "Racket"), - ("ragel", "Ragel"), - ("ragel-c", "Ragel in C Host"), - ("ragel-cpp", "Ragel in CPP Host"), - ("ragel-d", "Ragel in D Host"), - ("ragel-em", "Embedded Ragel"), - ("ragel-java", "Ragel in Java Host"), - ("ragel-objc", "Ragel in Objective C Host"), - ("ragel-ruby", "Ragel in Ruby Host"), - ("rbcon", "Ruby irb session"), - ("rconsole", "RConsole"), - ("rd", "Rd"), - ("reasonml", "ReasonML"), - ("rebol", "REBOL"), - ("red", "Red"), - ("redcode", "Redcode"), - ("registry", "reg"), - ("resourcebundle", "ResourceBundle"), - ("restructuredtext", "reStructuredText"), - ("rexx", "Rexx"), - ("rhtml", "RHTML"), - ("ride", "Ride"), - ("rita", "Rita"), - ("rng-compact", "Relax-NG Compact"), - ("roboconf-graph", "Roboconf Graph"), - ("roboconf-instances", "Roboconf Instances"), - ("robotframework", "RobotFramework"), - ("rql", "RQL"), - ("rsl", "RSL"), - ("ruby", "Ruby"), - ("rust", "Rust"), - ("sarl", "SARL"), - ("sas", "SAS"), - ("sass", "Sass"), - ("savi", "Savi"), - ("scala", "Scala"), - ("scaml", "Scaml"), - ("scdoc", "scdoc"), - ("scheme", "Scheme"), - ("scilab", "Scilab"), - ("scss", "SCSS"), - ("sed", "Sed"), - ("sgf", "SmartGameFormat"), - ("shen", "Shen"), - ("shexc", "ShExC"), - ("sieve", "Sieve"), - ("silver", "Silver"), - ("singularity", "Singularity"), - ("slash", "Slash"), - ("slim", "Slim"), - ("slurm", "Slurm"), - ("smali", "Smali"), - ("smalltalk", "Smalltalk"), - ("smarty", "Smarty"), - ("smithy", "Smithy"), - ("sml", "Standard ML"), - ("snbt", "SNBT"), - ("snobol", "Snobol"), - ("snowball", "Snowball"), - ("solidity", "Solidity"), - ("sophia", "Sophia"), - ("sp", "SourcePawn"), - ("sparql", "SPARQL"), - ("spec", "RPMSpec"), - ("spice", "Spice"), - ("splus", "S"), - ("sql", "SQL"), - ("sql+jinja", "SQL+Jinja"), - ("sqlite3", "sqlite3con"), - ("squidconf", "SquidConf"), - ("srcinfo", "Srcinfo"), - ("ssp", "Scalate Server Page"), - ("stan", "Stan"), - ("stata", "Stata"), - ("supercollider", "SuperCollider"), - ("swift", "Swift"), - ("swig", "SWIG"), - ("systemverilog", "systemverilog"), - ("tads3", "TADS 3"), - ("tal", "Tal"), - ("tap", "TAP"), - ("tasm", "TASM"), - ("tcl", "Tcl"), - ("tcsh", "Tcsh"), - ("tcshcon", "Tcsh Session"), - ("tea", "Tea"), - ("teal", "teal"), - ("teratermmacro", "Tera Term macro"), - ("termcap", "Termcap"), - ("terminfo", "Terminfo"), - ("terraform", "Terraform"), - ("tex", "TeX"), - ("text", "Text only"), - ("thrift", "Thrift"), - ("ti", "ThingsDB"), - ("tid", "tiddler"), - ("tnt", "Typographic Number Theory"), - ("todotxt", "Todotxt"), - ("toml", "TOML"), - ("trac-wiki", "MoinMoin/Trac Wiki markup"), - ("trafficscript", "TrafficScript"), - ("treetop", "Treetop"), - ("tsql", "Transact-SQL"), - ("turtle", "Turtle"), - ("twig", "Twig"), - ("typescript", "TypeScript"), - ("typoscript", "TypoScript"), - ("typoscriptcssdata", "TypoScriptCssData"), - ("typoscripthtmldata", "TypoScriptHtmlData"), - ("ucode", "ucode"), - ("ul4", "UL4"), - ("unicon", "Unicon"), - ("unixconfig", "Unix/Linux config files"), - ("urbiscript", "UrbiScript"), - ("usd", "USD"), - ("vala", "Vala"), - ("vb.net", "VB.net"), - ("vbscript", "VBScript"), - ("vcl", "VCL"), - ("vclsnippets", "VCLSnippets"), - ("vctreestatus", "VCTreeStatus"), - ("velocity", "Velocity"), - ("verilog", "verilog"), - ("vgl", "VGL"), - ("vhdl", "vhdl"), - ("vim", "VimL"), - ("wast", "WebAssembly"), - ("wdiff", "WDiff"), - ("webidl", "Web IDL"), - ("whiley", "Whiley"), - ("x10", "X10"), - ("xml", "XML"), - ("xml+cheetah", "XML+Cheetah"), - ("xml+django", "XML+Django/Jinja"), - ("xml+evoque", "XML+Evoque"), - ("xml+lasso", "XML+Lasso"), - ("xml+mako", "XML+Mako"), - ("xml+mako", "XML+Mako"), - ("xml+myghty", "XML+Myghty"), - ("xml+php", "XML+PHP"), - ("xml+ruby", "XML+Ruby"), - ("xml+smarty", "XML+Smarty"), - ("xml+ul4", "XML+UL4"), - ("xml+velocity", "XML+Velocity"), - ("xorg.conf", "Xorg"), - ("xquery", "XQuery"), - ("xslt", "XSLT"), - ("xtend", "Xtend"), - ("xul+mozpreproc", "XUL+mozpreproc"), - ("yaml", "YAML"), - ("yaml+jinja", "YAML+Jinja"), - ("yang", "YANG"), - ("zeek", "Zeek"), - ("zephir", "Zephir"), - ("zig", "Zig"), - ], - default="python", - max_length=100, - ), - ), - ( - "style", - models.CharField( - choices=[ - ("abap", "abap"), - ("algol", "algol"), - ("algol_nu", "algol_nu"), - ("arduino", "arduino"), - ("autumn", "autumn"), - ("borland", "borland"), - ("bw", "bw"), - ("colorful", "colorful"), - ("default", "default"), - ("dracula", "dracula"), - ("emacs", "emacs"), - ("friendly", "friendly"), - ("friendly_grayscale", "friendly_grayscale"), - ("fruity", "fruity"), - ("github-dark", "github-dark"), - ("gruvbox-dark", "gruvbox-dark"), - ("gruvbox-light", "gruvbox-light"), - ("igor", "igor"), - ("inkpot", "inkpot"), - ("lilypond", "lilypond"), - ("lovelace", "lovelace"), - ("manni", "manni"), - ("material", "material"), - ("monokai", "monokai"), - ("murphy", "murphy"), - ("native", "native"), - ("nord", "nord"), - ("nord-darker", "nord-darker"), - ("one-dark", "one-dark"), - ("paraiso-dark", "paraiso-dark"), - ("paraiso-light", "paraiso-light"), - ("pastie", "pastie"), - ("perldoc", "perldoc"), - ("rainbow_dash", "rainbow_dash"), - ("rrt", "rrt"), - ("sas", "sas"), - ("solarized-dark", "solarized-dark"), - ("solarized-light", "solarized-light"), - ("staroffice", "staroffice"), - ("stata", "stata"), - ("stata-dark", "stata-dark"), - ("stata-light", "stata-light"), - ("tango", "tango"), - ("trac", "trac"), - ("vim", "vim"), - ("vs", "vs"), - ("xcode", "xcode"), - ("zenburn", "zenburn"), - ], - default="friendly", - max_length=100, - ), - ), - ("highlighted", models.TextField()), - ( - "access", - models.CharField( - choices=[ - ("public", "Public"), - ("private", "Private"), - ("owner-only", "Owner only"), - ], - default="private", - max_length=20, - verbose_name="Access type", - ), - ), - ( - "owner", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - verbose_name="Snippet owner", - ), - ), - ], - options={ - "ordering": ["created"], - }, - ), - migrations.CreateModel( - name="SnippetParticipant", - fields=[ - ( - "id", - models.IntegerField( - primary_key=True, serialize=False, verbose_name="ID" - ), - ), - ( - "snippet", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="backend.snippet", - verbose_name="Associated Snippet", - ), - ), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - verbose_name="Associated User", - ), - ), - ], - ), - ] diff --git a/backend_legacy/backend/migrations/__init__.py b/backend_legacy/backend/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/backend_legacy/backend/models.py b/backend_legacy/backend/models.py deleted file mode 100644 index abf264c..0000000 --- a/backend_legacy/backend/models.py +++ /dev/null @@ -1,69 +0,0 @@ -from django.db import models -from pygments.lexers import get_all_lexers -from pygments.styles import get_all_styles -from pygments.lexers import get_lexer_by_name -from pygments.formatters.html import HtmlFormatter -from pygments import highlight - -LEXERS = [item for item in get_all_lexers() if item[1]] -LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) -STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()]) -ACCESS_TYPES = (("public", "Public"), ("private", "Private"), ("owner-only", "Owner only")) - - -class Snippet(models.Model): - created = models.DateTimeField(auto_now_add=True) - title = models.CharField(max_length=100, blank=True, default='') - content = models.TextField() - linenos = models.BooleanField(default=False) - language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) - style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) - highlighted = models.TextField() - owner = models.ForeignKey( - verbose_name="Snippet owner", - to="auth.User", - on_delete=models.CASCADE - ) - access = models.CharField( - verbose_name="Access type", - choices=ACCESS_TYPES, - default="private", - max_length=20 - ) - - def save(self, *args, **kwargs): - """ - Use the `pygments` library to create a highlighted HTML - representation of the code snippet. - """ - lexer = get_lexer_by_name(self.language) - linenos = 'table' if self.linenos else False - options = {'title': self.title} if self.title else {} - formatter = HtmlFormatter( - style=self.style, - linenos=linenos, - full=True, - **options - ) - self.highlighted = highlight(self.content, lexer, formatter) - super().save(*args, **kwargs) - - class Meta: - ordering = ['created'] - - -class SnippetParticipant(models.Model): - id = models.IntegerField( - verbose_name="ID", - primary_key=True - ) - user = models.ForeignKey( - verbose_name="Associated User", - to="auth.User", - on_delete=models.CASCADE - ) - snippet = models.ForeignKey( - verbose_name="Associated Snippet", - to=Snippet, - on_delete=models.CASCADE - ) diff --git a/backend_legacy/backend/permissions.py b/backend_legacy/backend/permissions.py deleted file mode 100644 index ced1f12..0000000 --- a/backend_legacy/backend/permissions.py +++ /dev/null @@ -1,26 +0,0 @@ -from rest_framework import permissions -from backend.models import SnippetParticipant - - -class IsOwnerOrReadOnly(permissions.BasePermission): - """ - Custom permission to only allow owners of an object to edit it. - """ - - def has_object_permission(self, request, view, obj): - # Read permissions are allowed to any request, - # so we'll always allow GET, HEAD or OPTIONS requests. - if request.method in permissions.SAFE_METHODS: - return True - - # Write permissions are only allowed to the owner of the snippet. - return obj.owner == request.user - - -class IsAccessedOrDeny(permissions.BasePermission): - - def has_object_permission(self, request, view, obj): - if obj.owner == request.user: - return True - allowed_users = SnippetParticipant.objects.filter(snippet=obj) - return request.user in [i.user for i in allowed_users] diff --git a/backend_legacy/backend/serializers.py b/backend_legacy/backend/serializers.py deleted file mode 100644 index e3d9ec6..0000000 --- a/backend_legacy/backend/serializers.py +++ /dev/null @@ -1,39 +0,0 @@ -from rest_framework import serializers -from backend.models import Snippet, SnippetParticipant -from django.contrib.auth.models import User - - -class UserSerializer(serializers.ModelSerializer): - snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all()) - - class Meta: - model = User - fields = ['id', 'username', 'snippets'] - - -class SnippetSerializer(serializers.ModelSerializer): - class Meta: - model = Snippet - fields = [ - "id", - "created", - "title", - "linenos", - "language", - "style", - "owner", - "access" - ] - read_only_fields = ["created", "owner"] - owner = serializers.ReadOnlyField(source='owner.username') - - -class SnippetParticipantSerializer(serializers.ModelSerializer): - class Meta: - model = SnippetParticipant - fields = [ - "id", - "user", - "snippet" - ] - read_only_fields = ["id"] diff --git a/backend_legacy/backend/settings.py b/backend_legacy/backend/settings.py deleted file mode 100644 index 6def201..0000000 --- a/backend_legacy/backend/settings.py +++ /dev/null @@ -1,125 +0,0 @@ -""" -Django settings for backend project. - -Generated by 'django-admin startproject' using Django 4.1.5. - -For more information on this file, see -https://docs.djangoproject.com/en/4.1/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/4.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/4.1/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = "django-insecure--d$%ho@_=xo$zrj&k2=#$o&p!b6ll*vi_$l5%pv$d%du0%gh%@" - -# 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", - "rest_framework", - "backend" -] - -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 = "backend.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 = "backend.wsgi.application" - - -# Database -# https://docs.djangoproject.com/en/4.1/ref/settings/#databases - -DATABASES = { - "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", - } -} - - -# Password validation -# https://docs.djangoproject.com/en/4.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/4.1/topics/i18n/ - -LANGUAGE_CODE = "en-us" - -TIME_ZONE = "UTC" - -USE_I18N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/4.1/howto/static-files/ - -STATIC_URL = "static/" - -# Default primary key field type -# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field - -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" diff --git a/backend_legacy/backend/urls.py b/backend_legacy/backend/urls.py deleted file mode 100644 index 630c432..0000000 --- a/backend_legacy/backend/urls.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.contrib import admin -from django.urls import path, include -from backend import views - -urlpatterns = [ - path("admin/", admin.site.urls), - path('users/', views.UserList.as_view()), - path('users//', views.UserDetail.as_view()), - path("snippets/", views.SnippetList.as_view()), - path("snippet/", views.SnippetDetail.as_view()), - path('api-auth/', include('rest_framework.urls')), -] diff --git a/backend_legacy/backend/views.py b/backend_legacy/backend/views.py deleted file mode 100644 index ea36421..0000000 --- a/backend_legacy/backend/views.py +++ /dev/null @@ -1,41 +0,0 @@ -from backend.models import Snippet, SnippetParticipant -from backend.serializers import SnippetSerializer, UserSerializer -from rest_framework import generics -from django.contrib.auth.models import User -from rest_framework import permissions -from backend.permissions import IsAccessedOrDeny - - -class UserList(generics.ListAPIView): - queryset = User.objects.all() - serializer_class = UserSerializer - - -class UserDetail(generics.RetrieveAPIView): - queryset = User.objects.all() - serializer_class = UserSerializer - - -class SnippetList(generics.ListCreateAPIView): - queryset = Snippet.objects.all() - serializer_class = SnippetSerializer - permission_classes = [permissions.IsAuthenticatedOrReadOnly] - - def perform_create(self, serializer): - serializer.save(owner=self.request.user) - - -class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): - queryset = Snippet.objects.all() - serializer_class = SnippetSerializer - permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsAccessedOrDeny] - - -class SnippetParticipantList(generics.ListCreateAPIView): - queryset = SnippetParticipant.objects.all() - serializer_class = SnippetSerializer - - -class SnippetParticipantDetail(generics.RetrieveUpdateDestroyAPIView): - queryset = SnippetParticipant.objects.all() - serializer_class = SnippetSerializer diff --git a/backend_legacy/backend/wsgi.py b/backend_legacy/backend/wsgi.py deleted file mode 100644 index 7d6cf06..0000000 --- a/backend_legacy/backend/wsgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for backend 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/4.1/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "backend.settings") - -application = get_wsgi_application() diff --git a/backend_legacy/db.sqlite3 b/backend_legacy/db.sqlite3 deleted file mode 100644 index 14bd4b576a883ec43a977cac4e27d3bc145fbb73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159744 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 + + } /> } /> + ); diff --git a/frontend/src/components/LoginForm.jsx b/frontend/src/components/LoginForm.jsx index 3933729..0a1cf2d 100644 --- a/frontend/src/components/LoginForm.jsx +++ b/frontend/src/components/LoginForm.jsx @@ -14,10 +14,12 @@ import { from 'mdb-react-ui-kit'; import 'mdb-react-ui-kit/dist/css/mdb.min.css'; import "@fortawesome/fontawesome-free/css/all.min.css"; +import { useContext } from "react"; +import AuthContext from "../context/AuthContext"; const LoginForm = () => { - const [justifyActive, setJustifyActive] = useState('tab1');; + const [justifyActive, setJustifyActive] = useState('tab1'); const handleJustifyClick = (value) => { if (value === justifyActive) { @@ -27,6 +29,14 @@ const LoginForm = () => { setJustifyActive(value); }; + const [username, setUsername] = useState("") + const [password, setPassword] = useState("") + + const { loginUser } = useContext(AuthContext); + const handleLoginSubmit = () => { + username.length > 0 && loginUser(username, password); + }; + return ( @@ -47,14 +57,19 @@ const LoginForm = () => { - - + setUsername(e.target.value)}/> + setPassword(e.target.value)}/>
- Sign in + + Sign in +

Not a member? handleJustifyClick('tab2')} active={justifyActive === 'tab2'}>Register

diff --git a/frontend/src/components/MainCard.jsx b/frontend/src/components/MainCard.jsx index 2dbcb3b..aaf1f3b 100644 --- a/frontend/src/components/MainCard.jsx +++ b/frontend/src/components/MainCard.jsx @@ -14,7 +14,7 @@ import {Link} from 'react-router-dom'; const MainCard = () => { return ( - + Welcome to CodeBox! diff --git a/frontend/src/context/AuthContext.jsx b/frontend/src/context/AuthContext.jsx index c7b4782..85ebcd7 100644 --- a/frontend/src/context/AuthContext.jsx +++ b/frontend/src/context/AuthContext.jsx @@ -1,8 +1,8 @@ import { createContext, useState, useEffect } from "react"; import jwt_decode from "jwt-decode"; -import { useHistory } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; -const AuthContext = createContext(); +const AuthContext = createContext(""); export default AuthContext; @@ -19,13 +19,14 @@ export const AuthProvider = ({ children }) => { ); const [loading, setLoading] = useState(true); - const history = useHistory(); + const history = useNavigate(); const loginUser = async (username, password) => { const response = await fetch("http://127.0.0.1:8000/api/auth/token/", { method: "POST", headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", }, body: JSON.stringify({ username, @@ -35,6 +36,7 @@ export const AuthProvider = ({ children }) => { const data = await response.json(); if (response.status === 200) { + console.log(response, data) setAuthTokens(data); setUser(jwt_decode(data.access)); localStorage.setItem("authTokens", JSON.stringify(data)); @@ -44,16 +46,16 @@ export const AuthProvider = ({ children }) => { } }; - const registerUser = async (username, password, password2) => { + const registerUser = async (username, password) => { const response = await fetch("http://127.0.0.1:8000/api/auth/register/", { method: "POST", headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", }, body: JSON.stringify({ username, - password, - password2 + password }) }); if (response.status === 201) {