summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshivam kohli <kohlishivam5522@gmail.com>2018-05-19 16:25:16 +0530
committershivam kohli <kohlishivam5522@gmail.com>2018-05-19 16:25:16 +0530
commit03c15c038ea802395734b55a965371d06e0117e3 (patch)
treef15ba2fac78846ac70282ac86f42f2f57a7d1315
downloadcodeless-03c15c038ea802395734b55a965371d06e0117e3.tar.gz
codeless-03c15c038ea802395734b55a965371d06e0117e3.tar.bz2
codeless-03c15c038ea802395734b55a965371d06e0117e3.zip
basic login
-rw-r--r--.DS_Storebin0 -> 6148 bytes
-rw-r--r--.gitignore5
-rw-r--r--codeless/__init__.py0
-rw-r--r--codeless/settings.py110
-rw-r--r--codeless/urls.py14
-rw-r--r--codeless/wsgi.py16
-rw-r--r--inventory/__init__.py0
-rw-r--r--inventory/admin.py13
-rw-r--r--inventory/forms.py39
-rw-r--r--inventory/migrations/0001_initial.py77
-rw-r--r--inventory/migrations/__init__.py0
-rw-r--r--inventory/models.py99
-rw-r--r--inventory/tests.py3
-rw-r--r--inventory/views.py72
-rwxr-xr-xmanage.py10
-rw-r--r--templates/inventory/home.html11
-rw-r--r--templates/inventory/index.html32
-rw-r--r--templates/inventory/login.html49
-rw-r--r--templates/inventory/signup.html45
19 files changed, 595 insertions, 0 deletions
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..3c10d02
--- /dev/null
+++ b/.DS_Store
Binary files differ
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