diff options
author | shivam kohli <kohlishivam5522@gmail.com> | 2018-05-19 16:25:16 +0530 |
---|---|---|
committer | shivam kohli <kohlishivam5522@gmail.com> | 2018-05-19 16:25:16 +0530 |
commit | 03c15c038ea802395734b55a965371d06e0117e3 (patch) | |
tree | f15ba2fac78846ac70282ac86f42f2f57a7d1315 | |
download | codeless-03c15c038ea802395734b55a965371d06e0117e3.tar.gz codeless-03c15c038ea802395734b55a965371d06e0117e3.tar.bz2 codeless-03c15c038ea802395734b55a965371d06e0117e3.zip |
basic login
-rw-r--r-- | .DS_Store | bin | 0 -> 6148 bytes | |||
-rw-r--r-- | .gitignore | 5 | ||||
-rw-r--r-- | codeless/__init__.py | 0 | ||||
-rw-r--r-- | codeless/settings.py | 110 | ||||
-rw-r--r-- | codeless/urls.py | 14 | ||||
-rw-r--r-- | codeless/wsgi.py | 16 | ||||
-rw-r--r-- | inventory/__init__.py | 0 | ||||
-rw-r--r-- | inventory/admin.py | 13 | ||||
-rw-r--r-- | inventory/forms.py | 39 | ||||
-rw-r--r-- | inventory/migrations/0001_initial.py | 77 | ||||
-rw-r--r-- | inventory/migrations/__init__.py | 0 | ||||
-rw-r--r-- | inventory/models.py | 99 | ||||
-rw-r--r-- | inventory/tests.py | 3 | ||||
-rw-r--r-- | inventory/views.py | 72 | ||||
-rwxr-xr-x | manage.py | 10 | ||||
-rw-r--r-- | templates/inventory/home.html | 11 | ||||
-rw-r--r-- | templates/inventory/index.html | 32 | ||||
-rw-r--r-- | templates/inventory/login.html | 49 | ||||
-rw-r--r-- | templates/inventory/signup.html | 45 |
19 files changed, 595 insertions, 0 deletions
diff --git a/.DS_Store b/.DS_Store Binary files differnew file mode 100644 index 0000000..3c10d02 --- /dev/null +++ b/.DS_Store diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31c2b3e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +db.sqlite3 +codeless/__pycache__/* +inventory/migrations/__pycache__/* +*.pyc +*.DS_Store diff --git a/codeless/__init__.py b/codeless/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/codeless/__init__.py diff --git a/codeless/settings.py b/codeless/settings.py new file mode 100644 index 0000000..9be921d --- /dev/null +++ b/codeless/settings.py @@ -0,0 +1,110 @@ +""" +Django settings for codeless project. + +Generated by 'django-admin startproject' using Django 1.8. + +For more information on this file, see +https://docs.djangoproject.com/en/1.8/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.8/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '58c29ykcsc)3__@8)ce%rk15_c=&uu!k#f!b(l4pbmlryp5s=p' + +# 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', + 'inventory', +) + +MIDDLEWARE_CLASSES = ( + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.security.SecurityMiddleware', +) + +ROOT_URLCONF = 'codeless.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 = 'codeless.wsgi.application' + + +TEMPLATE_PATH = os.path.join(BASE_DIR, 'templates') + +TEMPLATE_DIRS = ( + TEMPLATE_PATH, +) + + +# Database +# https://docs.djangoproject.com/en/1.8/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Internationalization +# https://docs.djangoproject.com/en/1.8/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/1.8/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/codeless/urls.py b/codeless/urls.py new file mode 100644 index 0000000..2badc2e --- /dev/null +++ b/codeless/urls.py @@ -0,0 +1,14 @@ +from django.conf.urls import include, url +from django.contrib import admin + +urlpatterns = [ + # Examples: + # url(r'^$', 'codeless.views.home', name='home'), + # url(r'^blog/', include('blog.urls')), + + url(r'^admin/', include(admin.site.urls)), + url(r'^signup/$', 'inventory.views.signup', name='signup'), + url(r'^home/$', 'inventory.views.home', name='home'), + url(r'^login/$', 'inventory.views.login', name='login'), + url(r'^logout/$', 'inventory.views.logout', name='logout'), +] diff --git a/codeless/wsgi.py b/codeless/wsgi.py new file mode 100644 index 0000000..12717af --- /dev/null +++ b/codeless/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for codeless 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/1.8/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "codeless.settings") + +application = get_wsgi_application() diff --git a/inventory/__init__.py b/inventory/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/inventory/__init__.py diff --git a/inventory/admin.py b/inventory/admin.py new file mode 100644 index 0000000..76bf7e8 --- /dev/null +++ b/inventory/admin.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from django.contrib import admin +from inventory.models import Product, Merchant, Order, Purchase, PaymentButton + +# Register your models here. + +admin.site.register(Product) +admin.site.register(Merchant) +admin.site.register(Order) +admin.site.register(Purchase) +admin.site.register(PaymentButton) diff --git a/inventory/forms.py b/inventory/forms.py new file mode 100644 index 0000000..2d32f5a --- /dev/null +++ b/inventory/forms.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User +from inventory.models import Merchant + + +class SignUpForm(UserCreationForm): + first_name = forms.CharField(max_length=30, required=False) + last_name = forms.CharField(max_length=30, required=False) + email = forms.EmailField(max_length=254) + + class Meta: + model = User + fields = ( + 'username', + 'first_name', + 'last_name', + 'email', + 'password1', + 'password2', + ) + + +class MerchantDetailForm(forms.ModelForm): + class Meta: + model = Merchant + fields = ("address",) + + +class LoginForm(forms.ModelForm): + class Meta: + model = User + fields = ( + "username", + "password" + ) diff --git a/inventory/migrations/0001_initial.py b/inventory/migrations/0001_initial.py new file mode 100644 index 0000000..cca4181 --- /dev/null +++ b/inventory/migrations/0001_initial.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Merchant', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('address', models.TextField()), + ('pay_url', models.URLField(max_length=250, default='NULL')), + ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Order', + fields=[ + ('order_id', models.AutoField(primary_key=True, serialize=False)), + ('description', models.CharField(max_length=300, blank=True, null=True)), + ('order_date', models.DateTimeField(auto_now=True)), + ('address', models.CharField(max_length=250, blank=True, null=True)), + ('fulfillment_url', models.URLField(default='NULL')), + ('merchant_id', models.ForeignKey(to='inventory.Merchant')), + ], + ), + migrations.CreateModel( + name='PaymentButton', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('text', models.CharField(max_length=100, blank=True, null=True)), + ('font_size', models.CharField(max_length=50, blank=True, null=True)), + ('color', models.CharField(max_length=50, blank=True, null=True)), + ('background_color', models.CharField(max_length=50, blank=True, null=True)), + ('border_radius', models.CharField(max_length=50, blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Product', + fields=[ + ('product_id', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=50, blank=True, null=True)), + ('description', models.CharField(max_length=300, blank=True, null=True)), + ('price', models.IntegerField(blank=True, null=True)), + ('delivery_date', models.DateTimeField(auto_now=True)), + ('starting_inventory', models.IntegerField(blank=True, null=True)), + ('minimuma_required', models.IntegerField(blank=True, null=True)), + ('inventory_on_hand', models.IntegerField(blank=True, null=True)), + ('inventory_recieved', models.IntegerField(blank=True, null=True)), + ('inventory_shipped', models.IntegerField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Purchase', + fields=[ + ('purchase_id', models.AutoField(primary_key=True, serialize=False)), + ('description', models.CharField(max_length=300, blank=True, null=True)), + ('purchase_date', models.DateTimeField(auto_now=True)), + ('product_recieved', models.IntegerField(blank=True, null=True)), + ('supplier', models.CharField(max_length=50, blank=True, null=True)), + ('product_id', models.ManyToManyField(null=True, to='inventory.Product')), + ], + ), + migrations.AddField( + model_name='order', + name='product_id', + field=models.ManyToManyField(null=True, to='inventory.Product'), + ), + ] diff --git a/inventory/migrations/__init__.py b/inventory/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/inventory/migrations/__init__.py diff --git a/inventory/models.py b/inventory/models.py new file mode 100644 index 0000000..4de9f1c --- /dev/null +++ b/inventory/models.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from django.db import models +from django.contrib.auth.models import User +from django.db.models.signals import post_save +from django.dispatch import receiver + + +class Product(models.Model): + """ The details of the product is described in this table. + This table tracks the inventory of the product. + """ + product_id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50, blank=True, null=True) + description = models.CharField(max_length=300, blank=True, null=True) + price = models.IntegerField(blank=True, null=True) + delivery_date = models.DateTimeField(auto_now=True) + starting_inventory = models.IntegerField(blank=True, null=True) + minimuma_required = models.IntegerField(blank=True, null=True) + # inventory_on_hand is updated by purchase and outgoing orders. + inventory_on_hand = models.IntegerField(blank=True, null=True) + inventory_recieved = models.IntegerField(blank=True, null=True) + inventory_shipped = models.IntegerField(blank=True, null=True) + + def __str__(self): + return self.name + + +class Merchant(models.Model): + """ Extending the default Django User Model. + This will hold a One-To-One relationship with the existing User Model. + """ + user = models.OneToOneField(User, on_delete=models.CASCADE) + address = models.TextField() + pay_url = models.URLField(max_length=250, default='NULL') + + def __str__(self): + return self.user.username + + +@receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + """ Hooking the create_user_profile method to + the User model, whenever a save event occurs + """ + if created: + Merchant.objects.create(user=instance) + + +@receiver(post_save, sender=User) +def save_user_profile(sender, instance, **kwargs): + """ Hooking the save_user_profile method to + the User model, whenever a save event occurs + """ + instance.Merchant.save() + + +class Order(models.Model): + """ Details of the order customer buys is updated in this table. + These details will be used to make request to the Merchant Backend API + """ + order_id = models.AutoField(primary_key=True) + product_id = models.ManyToManyField(Product, null=True) + description = models.CharField(max_length=300, blank=True, null=True) + order_date = models.DateTimeField(auto_now=True) + address = models.CharField(max_length=250, blank=True, null=True) + merchant_id = models.ForeignKey(Merchant, on_delete=models.CASCADE) + fulfillment_url = models.URLField(max_length=200, default='NULL') + + def __str__(self): + return self.description + + +class Purchase(models.Model): + """ To keep a track of the purchases the merchant makes. + This table is essential to update the inverntory in hand. + """ + purchase_id = models.AutoField(primary_key=True) + product_id = models.ManyToManyField(Product, null=True) + description = models.CharField(max_length=300, blank=True, null=True) + purchase_date = models.DateTimeField(auto_now=True) + product_recieved = models.IntegerField(blank=True, null=True) + supplier = models.CharField(max_length=50, blank=True, null=True) + + def __str__(self): + return self.description + + +class PaymentButton(models.Model): + """ Design pattern for the payment button are stored in this table. """ + text = models.CharField(max_length=100, blank=True, null=True) + font_size = models.CharField(max_length=50, blank=True, null=True) + color = models.CharField(max_length=50, blank=True, null=True) + background_color = models.CharField(max_length=50, blank=True, null=True) + border_radius = models.CharField(max_length=50, blank=True, null=True) + + def __str__(self): + return self.text diff --git a/inventory/tests.py b/inventory/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/inventory/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/inventory/views.py b/inventory/views.py new file mode 100644 index 0000000..80be28e --- /dev/null +++ b/inventory/views.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from inventory.forms import SignUpForm, MerchantDetailForm, LoginForm +from inventory.models import Merchant +from django.contrib.auth import authenticate +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.shortcuts import get_object_or_404 +from django.contrib.auth.decorators import login_required +from django.shortcuts import render, redirect +from django.core.urlresolvers import resolve + +# Create your views here. + + +@login_required +def home(request): + return render(request, 'inventory/home.html') + + +def signup(request): + if request.method == 'POST': + form = SignUpForm(request.POST) + details_form = MerchantDetailForm(request.POST) + if form.is_valid(): + form.save() + username = form.cleaned_data.get('username') + raw_password = form.cleaned_data.get('password1') + user = authenticate(username=username, password=raw_password) + auth_login(request, user) + instance = get_object_or_404(Merchant, user=user) + if details_form.is_valid(): + instance.address = details_form.cleaned_data.get('address') + instance.save() + else: + print("somethings wrong with the form") + # Redirect to a success page. + return redirect('home') + else: + form = SignUpForm() + details_form = MerchantDetailForm() + dictionary = {'form': form, 'details_form': details_form} + return render(request, 'inventory/signup.html', dictionary) + + +def login(request): + form = LoginForm() + context_dict = {} + context_dict['form'] = form + error_message = "" + if request.method == 'POST': + username = request.POST['username'] + password = request.POST['password'] + user = authenticate(username=username, password=password) + if user is not None: + auth_login(request, user) + current_url = resolve(request.path_info).url_name + print(current_url) + # Redirect to a success page. + return redirect('home') + else: + error_message = "You are not a registered user please sign up" + form = LoginForm() + context_dict['form'] = form + context_dict['error_message'] = error_message + return render(request, 'inventory/login.html', context_dict) + + +def logout(request): + auth_logout(request) + return render(request, 'inventory/index.html') diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..b812476 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "codeless.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/templates/inventory/home.html b/templates/inventory/home.html new file mode 100644 index 0000000..424bab3 --- /dev/null +++ b/templates/inventory/home.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> +<head> + <title>Home</title> +</head> +<body> +<h1>Welcome!!!!</h1> +<h4>You are successfully loged in</h4> +<a href="/logout">logout</a></li> +</body> +</html>
\ No newline at end of file diff --git a/templates/inventory/index.html b/templates/inventory/index.html new file mode 100644 index 0000000..ab79a2b --- /dev/null +++ b/templates/inventory/index.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html> +<head> + <title>Login</title> +</head> +<body> +<div style="background: linear-gradient(0deg, #F6F0E1 20%, rgba(200,200,200,0) 100%); height: 100%"; > + <div> + <div> + <p>Login</p> + </div> + + <form method="post"> + <div> + <span>Login</span> + <a href="/login">Log in</a> + </div> + <div> + <span>New User?</span> + <a href="/signup">Create Account</a> + </div> + </div> + + </fieldset> + </form> + + </div> +</div> +</div> + +</body> +</html>
\ No newline at end of file diff --git a/templates/inventory/login.html b/templates/inventory/login.html new file mode 100644 index 0000000..d407b3f --- /dev/null +++ b/templates/inventory/login.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html> +<head> + <title>Login</title> +</head> +<body> +<div style="background: linear-gradient(0deg, #F6F0E1 20%, rgba(200,200,200,0) 100%); height: 100%"; > + <div> + <div> + <p>Login</p> + </div> + + <form method="post"> + {% csrf_token %} + + <fieldset> + {% for field in form %} + <div> + <p> + {{ field.label_tag }}<br> + {{ field }} + {% if field.help_text %} + <small style="color: grey">{{ field.help_text }}</small> + {% endif %} + </div> + + {% endfor %} + + </fieldset> + <fieldset> + {{error_message}} + <button type="submit">Log in</button> + + <div> + <div> + <span>New User?</span> + <a href="/signup">Create Account</a> + </div> + </div> + + </fieldset> + </form> + + </div> +</div> +</div> + +</body> +</html>
\ No newline at end of file diff --git a/templates/inventory/signup.html b/templates/inventory/signup.html new file mode 100644 index 0000000..5a0137f --- /dev/null +++ b/templates/inventory/signup.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html> +<head> + <title>Sign Up</title> +</head> +<body> +<div <div style="background: linear-gradient(0deg, #F6F0E1 20%, rgba(200,200,200,0) 100%); height: 100%"; > + <h1>Sign up</h1> + {% block content %} + + <form method="post" enctype="multipart/form-data"> + {% csrf_token %} + {% for field in form %} + <p> + {{ field.label_tag }}<br> + {{ field }} + {% if field.help_text %} + <small style="color: grey">{{ field.help_text }}</small> + {% endif %} + {% for error in field.errors %} + <p style="color: red">{{ error }}</p> + {% endfor %} + </p> + {% endfor %} + + {% for field in details_form %} + <p> + {{ field.label_tag }}<br> + {{ field }} + {% if field.help_text %} + <small style="color: grey">{{ field.help_text }}</small> + {% endif %} + {% for error in field.errors %} + <p style="color: red">{{ error }}</p> + {% endfor %} + </p> + {% endfor %} + <button type="submit">Sign up</button> + </form> + + <div> + {% endblock %} +</div> +</body> +</html>
\ No newline at end of file |