From 67a5ff1a83b9327828af7127c88a616d16d7a798 Mon Sep 17 00:00:00 2001
From: Jeff
Date: Wed, 12 Sep 2018 18:03:20 +0300
Subject: [PATCH 1/8] Add files via upload
---
airtime_pap/Pipfile | 14 ++
airtime_pap/Pipfile.lock | 107 +++++++++++++++
airtime_pap/airtime_app/admin.py | 4 +
airtime_pap/airtime_app/apps.py | 5 +
airtime_pap/airtime_app/forms.py | 20 +++
.../airtime_app/migrations/0001_initial.py | 27 ++++
airtime_pap/airtime_app/models.py | 27 ++++
.../templates/airtime_app/contacts.html | 8 ++
.../templates/airtime_app/create_contact.html | 9 ++
.../templates/airtime_app/form_snippet.html | 15 ++
.../templates/airtime_app/home.html | 5 +
.../templates/airtime_app/selectToSend.html | 15 ++
.../templates/airtime_app/send_airtime.html | 20 +++
.../templates/airtime_app/signup.html | 14 ++
.../templates/registration/login.html | 9 ++
airtime_pap/airtime_app/tests.py | 3 +
airtime_pap/airtime_app/urls.py | 26 ++++
airtime_pap/airtime_app/views.py | 123 +++++++++++++++++
airtime_pap/airtime_project/settings.py | 129 ++++++++++++++++++
airtime_pap/airtime_project/urls.py | 22 +++
airtime_pap/airtime_project/wsgi.py | 16 +++
airtime_pap/contacts_selected | Bin 0 -> 24 bytes
airtime_pap/db.sqlite3 | Bin 0 -> 151552 bytes
airtime_pap/manage.py | 15 ++
24 files changed, 633 insertions(+)
create mode 100644 airtime_pap/Pipfile
create mode 100644 airtime_pap/Pipfile.lock
create mode 100644 airtime_pap/airtime_app/admin.py
create mode 100644 airtime_pap/airtime_app/apps.py
create mode 100644 airtime_pap/airtime_app/forms.py
create mode 100644 airtime_pap/airtime_app/migrations/0001_initial.py
create mode 100644 airtime_pap/airtime_app/models.py
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/contacts.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/create_contact.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/form_snippet.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/home.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/selectToSend.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/send_airtime.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/signup.html
create mode 100644 airtime_pap/airtime_app/templates/registration/login.html
create mode 100644 airtime_pap/airtime_app/tests.py
create mode 100644 airtime_pap/airtime_app/urls.py
create mode 100644 airtime_pap/airtime_app/views.py
create mode 100644 airtime_pap/airtime_project/settings.py
create mode 100644 airtime_pap/airtime_project/urls.py
create mode 100644 airtime_pap/airtime_project/wsgi.py
create mode 100644 airtime_pap/contacts_selected
create mode 100644 airtime_pap/db.sqlite3
create mode 100644 airtime_pap/manage.py
diff --git a/airtime_pap/Pipfile b/airtime_pap/Pipfile
new file mode 100644
index 0000000..da9ef57
--- /dev/null
+++ b/airtime_pap/Pipfile
@@ -0,0 +1,14 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+django = "==2.1.1"
+africastalking = "*"
+django-phonenumber-field = "*"
+
+[dev-packages]
+
+[requires]
+python_version = "3.6"
diff --git a/airtime_pap/Pipfile.lock b/airtime_pap/Pipfile.lock
new file mode 100644
index 0000000..1a72bc8
--- /dev/null
+++ b/airtime_pap/Pipfile.lock
@@ -0,0 +1,107 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "5ce77e79cd04ec1b93e0967e4301c3468766532dfb5c1f16e7cea5e60361b321"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.6"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "africastalking": {
+ "hashes": [
+ "sha256:d243f8b3de9c0951ec4caf9d032cdb2bb3f42cf5988984e369e129b2122cecb1"
+ ],
+ "index": "pypi",
+ "version": "==1.1.4"
+ },
+ "babel": {
+ "hashes": [
+ "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669",
+ "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23"
+ ],
+ "version": "==2.6.0"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638",
+ "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a"
+ ],
+ "version": "==2018.8.24"
+ },
+ "chardet": {
+ "hashes": [
+ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
+ "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+ ],
+ "version": "==3.0.4"
+ },
+ "django": {
+ "hashes": [
+ "sha256:04f2e423f2e60943c02bd2959174b844f7d1bcd19eabb7f8e4282999958021fd",
+ "sha256:e1cc1cd6b658aa4e052f5f2b148bfda08091d7c3558529708342e37e4e33f72c"
+ ],
+ "index": "pypi",
+ "version": "==2.1.1"
+ },
+ "django-phonenumber-field": {
+ "hashes": [
+ "sha256:08257904750d7329b2b11dd9d8d6b7ceb261980db555bb426d9900fa390e2a4c"
+ ],
+ "index": "pypi",
+ "version": "==2.0.1"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e",
+ "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"
+ ],
+ "version": "==2.7"
+ },
+ "phonenumbers": {
+ "hashes": [
+ "sha256:42d55b4202c26c1bdbd69c33e847e0b55f939191d403e620c150cb2a96bf5494",
+ "sha256:ea68fd4a60ac7c647c02c0e74191f7885e84f18f8c206d1300b52859e0002ad6"
+ ],
+ "version": "==8.9.13"
+ },
+ "pytz": {
+ "hashes": [
+ "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053",
+ "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277"
+ ],
+ "version": "==2018.5"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1",
+ "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a"
+ ],
+ "version": "==2.19.1"
+ },
+ "schema": {
+ "hashes": [
+ "sha256:d994b0dc4966000037b26898df638e3e2a694cc73636cb2050e652614a350687",
+ "sha256:fa1a53fe5f3b6929725a4e81688c250f46838e25d8c1885a10a590c8c01a7b74"
+ ],
+ "version": "==0.6.8"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
+ "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
+ ],
+ "markers": "python_version >= '2.6' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version < '4' and python_version != '3.3.*'",
+ "version": "==1.23"
+ }
+ },
+ "develop": {}
+}
diff --git a/airtime_pap/airtime_app/admin.py b/airtime_pap/airtime_app/admin.py
new file mode 100644
index 0000000..7cb2413
--- /dev/null
+++ b/airtime_pap/airtime_app/admin.py
@@ -0,0 +1,4 @@
+from django.contrib import admin
+from .models import Contact
+# Register your models here.
+admin.site.register(Contact)
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/apps.py b/airtime_pap/airtime_app/apps.py
new file mode 100644
index 0000000..4b064ab
--- /dev/null
+++ b/airtime_pap/airtime_app/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class AirtimeAppConfig(AppConfig):
+ name = 'airtime_app'
diff --git a/airtime_pap/airtime_app/forms.py b/airtime_pap/airtime_app/forms.py
new file mode 100644
index 0000000..95921ea
--- /dev/null
+++ b/airtime_pap/airtime_app/forms.py
@@ -0,0 +1,20 @@
+from django.forms import ModelForm
+from .models import Contact
+
+class CreateContactForm(ModelForm):
+ ''' creates a new contact '''
+
+ class Meta:
+ model = Contact
+ fields = ['first_name', 'last_name', 'phone_number']
+ labels = {
+ 'first_name': 'First Name',
+ 'last_name': 'Last Name',
+ 'phone_number': 'Phone Number'
+ }
+
+ help_texts = {
+ 'phone_number': 'enter phone number in the format +2547XXXXXXXX'
+ }
+
+
diff --git a/airtime_pap/airtime_app/migrations/0001_initial.py b/airtime_pap/airtime_app/migrations/0001_initial.py
new file mode 100644
index 0000000..dbaa26c
--- /dev/null
+++ b/airtime_pap/airtime_app/migrations/0001_initial.py
@@ -0,0 +1,27 @@
+# Generated by Django 2.1.1 on 2018-09-12 12:05
+
+from django.conf import settings
+from django.db import migrations, models
+import phonenumber_field.modelfields
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Contact',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('first_name', models.CharField(max_length=100)),
+ ('last_name', models.CharField(max_length=100)),
+ ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128)),
+ ('owner', models.ManyToManyField(to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/airtime_pap/airtime_app/models.py b/airtime_pap/airtime_app/models.py
new file mode 100644
index 0000000..d9c4f46
--- /dev/null
+++ b/airtime_pap/airtime_app/models.py
@@ -0,0 +1,27 @@
+from django.db import models
+from django.contrib.auth.models import User
+from phonenumber_field.modelfields import PhoneNumberField
+
+
+# Create your models here.
+
+class Contact(models.Model):
+ '''
+ defines a contact entry in the phonebook
+ a contact is associated with a user
+ '''
+
+ first_name = models.CharField(max_length = 100)
+ last_name = models.CharField(max_length = 100)
+ phone_number = PhoneNumberField()
+
+ owner = models.ManyToManyField(User)
+
+ def __str__(self):
+ person = self.first_name + ' ' + self.last_name
+ return person
+
+
+
+
+
diff --git a/airtime_pap/airtime_app/templates/airtime_app/contacts.html b/airtime_pap/airtime_app/templates/airtime_app/contacts.html
new file mode 100644
index 0000000..1609a42
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/contacts.html
@@ -0,0 +1,8 @@
+contacts list
+
+
+ {% for cont in contacts%}
+ - {{cont.first_name}} {{cont.last_name}} {{cont.phone_number}}
+
+ {% endfor %}
+
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/templates/airtime_app/create_contact.html b/airtime_pap/airtime_app/templates/airtime_app/create_contact.html
new file mode 100644
index 0000000..81d6fda
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/create_contact.html
@@ -0,0 +1,9 @@
+ Add Contact
+
+
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/templates/airtime_app/form_snippet.html b/airtime_pap/airtime_app/templates/airtime_app/form_snippet.html
new file mode 100644
index 0000000..0f787ec
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/form_snippet.html
@@ -0,0 +1,15 @@
+
+{{ form.non_field_errors }}
+
+{% for field in form %}
+
+ {{ field.label_tag }}
+ {{ field }}
+ {% if field.help_text %}
+ {{ field.help_text }}
+ {% endif %}
+ {% for error in field.errors %}
+
{{ error }}
+ {% endfor %}
+
+{% endfor %}
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/templates/airtime_app/home.html b/airtime_pap/airtime_app/templates/airtime_app/home.html
new file mode 100644
index 0000000..6e817ed
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/home.html
@@ -0,0 +1,5 @@
+ Welcome Home
+
+Add New Contact
+View Contacts
+Send Airtime
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/templates/airtime_app/selectToSend.html b/airtime_pap/airtime_app/templates/airtime_app/selectToSend.html
new file mode 100644
index 0000000..cbf4d8b
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/selectToSend.html
@@ -0,0 +1,15 @@
+Select contact(s)
+
+
+
diff --git a/airtime_pap/airtime_app/templates/airtime_app/send_airtime.html b/airtime_pap/airtime_app/templates/airtime_app/send_airtime.html
new file mode 100644
index 0000000..bb7cdfe
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/send_airtime.html
@@ -0,0 +1,20 @@
+
+
+Select contact(s)
+
+
+
diff --git a/airtime_pap/airtime_app/templates/airtime_app/signup.html b/airtime_pap/airtime_app/templates/airtime_app/signup.html
new file mode 100644
index 0000000..0279c3e
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/airtime_app/signup.html
@@ -0,0 +1,14 @@
+
+
+ Sign up
+
+
+
+
+
diff --git a/airtime_pap/airtime_app/templates/registration/login.html b/airtime_pap/airtime_app/templates/registration/login.html
new file mode 100644
index 0000000..560306a
--- /dev/null
+++ b/airtime_pap/airtime_app/templates/registration/login.html
@@ -0,0 +1,9 @@
+ Log in
+
+
diff --git a/airtime_pap/airtime_app/tests.py b/airtime_pap/airtime_app/tests.py
new file mode 100644
index 0000000..de8bdc0
--- /dev/null
+++ b/airtime_pap/airtime_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/airtime_pap/airtime_app/urls.py b/airtime_pap/airtime_app/urls.py
new file mode 100644
index 0000000..9506ae7
--- /dev/null
+++ b/airtime_pap/airtime_app/urls.py
@@ -0,0 +1,26 @@
+from django.urls import path, include
+from django.contrib.auth import views as auth_views
+from . import views
+
+urlpatterns = [
+
+ # sign up for an account
+ path('signup/', views.signup, name='signup'),
+
+ path('accounts/', include('django.contrib.auth.urls')),
+
+ # create a contact
+ path('add_contact/', views.CreateContact.as_view(), name='add_contact'),
+
+ # list of contacts
+ path('contacts/', views.listContacts, name='contacts'),
+
+ # select contacts to send airtime
+ path('select_contacts/', views.selectToSend, name='select_contacts'),
+
+ # send airtime
+ path('send_airtime//', views.sendAirtime, name='send_airtime'),
+
+ # home page
+ path('', views.Home.as_view(), name='home'),
+]
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/views.py b/airtime_pap/airtime_app/views.py
new file mode 100644
index 0000000..358a893
--- /dev/null
+++ b/airtime_pap/airtime_app/views.py
@@ -0,0 +1,123 @@
+from django.shortcuts import render, redirect
+from django.contrib.auth import login, authenticate
+from django.contrib.auth.forms import UserCreationForm
+from django.contrib.auth.models import User
+from django.views import generic, View
+from .forms import CreateContactForm
+from .models import Contact
+import pickle
+# selected contacts
+
+contacts_selected = ''
+
+
+# Create your views here.
+
+class Home(generic.TemplateView):
+ ''' Displays the home page '''
+
+ template_name = "airtime_app/home.html"
+
+
+
+def signup(request):
+ ''' this view allows a user to sign up and logs them in '''
+
+ if request.method == 'POST':
+ form = UserCreationForm(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)
+
+ #login user
+ login(request, user)
+ return redirect('home')
+
+ else:
+ form = UserCreationForm()
+
+ return render(request, 'airtime_app/signup.html', {'form':form})
+
+
+def listContacts(request):
+ ''' lists all user contacts '''
+
+ current_user = request.user
+
+ current_user_contacts = current_user.contact_set.all()
+
+ return render(request, 'airtime_app/contacts.html', {'contacts': current_user_contacts})
+
+class CreateContact(View):
+
+ def post(self, request):
+
+ form = CreateContactForm(request.POST)
+
+ if form.is_valid():
+
+ first_name = form.cleaned_data['first_name']
+ last_name = form.cleaned_data['last_name']
+ phone_number = form.cleaned_data['phone_number']
+ owner = request.user
+
+ # create contact
+ contact = Contact.objects.create(
+ first_name=first_name,
+ last_name=last_name,
+ phone_number=phone_number,
+ )
+
+ # create contact - owner relationship
+ request.user.contact_set.add(contact)
+
+ return redirect('contacts')
+
+ else:
+ return render(request, 'airtime_app/create_contact.html', {'form':form})
+
+
+ def get(self, request):
+
+ form = CreateContactForm()
+
+ return render(request, 'airtime_app/create_contact.html', {'form':form})
+
+
+def selectToSend(request):
+ ''' displays a list of contacts for selection before sending airtime '''
+
+ if request.method == 'GET':
+ current_user = request.user
+ current_user_contacts = current_user.contact_set.all()
+
+ return render(request, 'airtime_app/selectToSend.html', {'contacts': current_user_contacts})
+
+ else:
+
+ selected = request.POST.getlist('selected_contacts')
+
+ with open('contacts_selected', 'wb') as file:
+ pickle.dump(selected, file)
+
+ return redirect('send_airtime')
+
+
+def sendAirtime(request, user):
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/airtime_pap/airtime_project/settings.py b/airtime_pap/airtime_project/settings.py
new file mode 100644
index 0000000..397fcaa
--- /dev/null
+++ b/airtime_pap/airtime_project/settings.py
@@ -0,0 +1,129 @@
+"""
+Django settings for airtime_project project.
+
+Generated by 'django-admin startproject' using Django 2.1.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.1/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.1/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+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/2.1/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'a3ihs3-xo-*hmu+!-o4-sdp2#x_uw#fk&)$f!x^35!wyag5+j3'
+
+# 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',
+
+ 'airtime_app.apps.AirtimeAppConfig',
+ 'phonenumber_field',
+]
+
+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 = 'airtime_project.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 = 'airtime_project.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.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/2.1/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/2.1/howto/static-files/
+
+STATIC_URL = '/static/'
+
+LOGIN_REDIRECT_URL = '/'
+LOGOUT_REDIRECT_URL = '/'
+
+# phone number default region setting
+PHONENUMBER_DEFAULT_REGION = 'KE'
\ No newline at end of file
diff --git a/airtime_pap/airtime_project/urls.py b/airtime_pap/airtime_project/urls.py
new file mode 100644
index 0000000..d9df853
--- /dev/null
+++ b/airtime_pap/airtime_project/urls.py
@@ -0,0 +1,22 @@
+"""airtime_project URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/2.1/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.urls import include, path
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
+"""
+from django.contrib import admin
+from django.urls import path, include
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('', include('airtime_app.urls'))
+]
diff --git a/airtime_pap/airtime_project/wsgi.py b/airtime_pap/airtime_project/wsgi.py
new file mode 100644
index 0000000..fb5eab9
--- /dev/null
+++ b/airtime_pap/airtime_project/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for airtime_project 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/2.1/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'airtime_project.settings')
+
+application = get_wsgi_application()
diff --git a/airtime_pap/contacts_selected b/airtime_pap/contacts_selected
new file mode 100644
index 0000000000000000000000000000000000000000..79354a9aeacd843866822832b201b206013b981d
GIT binary patch
literal 24
bcmZo*jxA)+h+t%3U@$CX1k=WaOsRSRHRl8f
literal 0
HcmV?d00001
diff --git a/airtime_pap/db.sqlite3 b/airtime_pap/db.sqlite3
new file mode 100644
index 0000000000000000000000000000000000000000..2ca4a792b2cc642d61a23e17ddf169ca5e5447d1
GIT binary patch
literal 151552
zcmeI5du$uYeaE?ct!ar|`N{LyK2frDHlvfwUA|>pFS14ZWLwlpmd=)&1G^-b)Jl9v
zB=vF-q|`arqD_GUMS~_la{=1?)&9{21uke3plwnFP0%OWCQZ|#k3WJGN$wh;N!q&r
zota&7moHi8JHzM8mv>%qXMXdW?|f!Q%)f|dab$5}q;^I0sG
z=gGej@~`o_O5WHTC*&_@df)5q^OmunRvgq=c$3mv7CmT&fQ^mfDR&mQKzt7BZftd_FMw!BeWPHj|`N-AF|Z>&|d_i9!<
zO_4Y8P%s?G1Tv|OlDgh*e&q6eVsatjTTD*REhc=^$*II`U%SzLeEMdSzTx&X!@l#w
zOqQA*e#SS<#1S>a{`$lr-kXneb=lCb#jYupqFSx0M+bQCOGNz4Ug9-RM0Z-00-1C!-d*>hed+FSc0b9D
z1Vrt!aKKx)#kt+VeaUSpY$}k+2BmO1V6>YKLIXWpPlu_|9{0%QK9$id8EH^0UPw{T
zdPv2Lwp5JCBvUTclu|8K+gVd+gOYNgXhaF6S;ZK3LYEpbVpF}mm}?~U^FZnbz!9P^sEHKW}lu7{zlSnlIqMW6<>08
z!IxaTal`k*{PfJ^{F3i_V#znTxG+1NBrazX$ps>nIq8~eK5->6pGaO#+%#pX=i&EF
z(b#z=X*xN*FgF>!&47t&k@bg&^uE
zzF$1(^d<&53+oK4>jm<_mLe6UJ=xHA`lF55eA~C1JivS7aqeE!s9&uu8CREfVRVGL
zy3~A!(E~LD&CC9}7-qY_#!RRig`y8n`?yw&1pCXwUmtMt-k~9`zS;(qF=uM|Uf>=G
zR%;uKb+%`Jkav2o4(-`2G~!yjVDAr*=VsRc&w;bf^TkPWNl2uAx
zTT2z>v{FbF$#X~{6^*2`!E7+i9zwb#aOf~w#u8oZ_IAvkLAs=(C2uOCLkcE}JW}Ot
zyf+x+b~jjkcS+eL$lhA-T`b;(x^Dqa1RLs&yM?(P&@7|q!&2$l$#s}`o3!szAAh|$O=QAfAoCZbIJWv_ZQq-?oj`C
z`d{sTv44md-~|F800JNY0w4eaAOHd&@c0mj3^*)jMkZyoLg&`#;4%;hh$*$C)>OG5
z1;p4`AU-BaK2e$o#3usbaWO6iLb0IWu$&&5tSZ`)Q?EoKOB5RqhQeYXe%0f!99x{E
z(+DI%JS7)uWa*8~FteFHI$TK=MB`id=CMM>iXeVrEB;Nxwb)
zM8~6IEEtVk?$mO6CQ+xssyMU?@Im
zC$0!(-IZjx(q)lGUZ!q4U4+Kt@klfl57>wca_Q+Vx?Xfz)rQ6+@pvp2zF;LxNeb=y
z*)u^f9Et?QC`ZtZw4>W2VURE<$>MI|Z!Nr#unON5{#f{k@L4tska&E$H7ErE5C8!X
z009sH0T2KI5C8!X0D*Urz-f=|InFe9#^!p+JVL6xRZ=Q@$J)GZTd-SVyVpS?y6mdp
z-Tk&fj%~uBGdb2HPTQzZ0@*XS>kI%h;(faFC?n
zg{npPflw8`E__S)lJFVfSKmc)a0LP&00JNY0w4eaAOHd&00JNY0zaDsy!JCE&C>yN
zzXO>{;E&o*pX3_*Z1lg*Q}&TFoOwrt>Ak~kKX#1G3(#2tyT^Xa%g)#*eQZbU$A;Lc
zF=t>sWcQwSvB`qQh6uXY;WZU@vq{D6*Ib$00S55Ex?RLwtV|1GU9sj#+
ztyZ!&xOwkzb$-BCJb&qV>u`$2=v^hdft3l4sE4cK^ivpCln(AOHd&00JNY0w4eaAOHd&
z00NJMz+pQ#!ttA`venq4e(I>5^K(4;YC?s4Z>T=lJgEhe?_w?Gn}JUrvU6uRo_-aA
zZgzsXb24}O$n*)8(y6=C1HD?H?oJOp&fGbvJ3ZvsaXUB0IhyLoNAl^X{Et3i=S0q7
zQm989(IQML^@zjA?A$2lXeiY~4+(Z|kh3%QbVNMB1lV=IG(^xsbcZy=qxiN;{2fTLf0%z5I8R5JZ
zt~)fsos6oLdNl$ahwZL&9P`{*!?z!`yGA+PZ6nae0(GB_K_=Ff64+TUqB(5mA+>SX~oRFduQeZq15aXd}{R1460CbF-U)>ZNHpT)I9Li>*sa
zKF}gdnh3-v!ol%)ToMD3)ymFVt<1y~)mmnG=Y#p8tQN*IX*vF0s+0jLh)&uOw
zv!jz89d?_Gv(tl(9;`N-%f-I`&wbD0`7?6B3j{y_1V8`;KmY_l00ck)1VG@S64M^?o3@P&Q7gGrwj4r?CtsT?cj@d@7%tY
zlW)zbv+DHDw7R9{LOW
zE*W2YCq;~J;|qr(QY^T8kz@2$yDq0UHdo{F&T2s1*v!Sk>w!!lmfHzcW>)gV
z+hX9()tT+tsYGD*Dpio!zOyhFTDo;*WoBWOC?N_~GGSsP&Q4{*d(hi{1oW2gOidH5
z)1ld0bHUk##MYgwbJEPz%+~C};?B&}sfY~00ck)1V8`;KmY_l00ck)1VG?DKmgpS1~1=ly6Upeqx|ETl0W6AzWyVJJj{+4^t`a8tro0dcm!S#V7
zymxkttBYzWt8B{~wdK@CRjH)%mGZ_~ReP^yQxRE|lx!^BZgBMSd}4AT;hRoQC2sqM
z+oLQVQ@nR08!IxaTal`k*{PfJ^{F3i_V#znTxG+1NB#veh$%SW#h)hi_
zmr^ygs0{nEa!sM{nn{U4IlZD}YANctrfk=kMtfmIRja
zN~)+-t8$+B*Bt1wh?7j2NG;V;wVgGE<}U=7>qn0A-Z^rqgxdUul1BRaLkO_GrETdV9BlMzifq_0IapW+C_CnAz&;@6)UMU7xZ%?;RZE
zUOCf>tO?^_4@hlvc5nCd-pNVs-o;iw9bIkHaYu~1M@}7vZCN*O5PROAA6CT}7cuSD
z_fb1Wf_+v|-y4=^XZ@UoU4hm0f?88jgre3R(s%kZR;pYe_qx{ezTM;j-W!i|_o7C<
zXl=>RQDtd5LS0?zqr>Qd>O%9fKU~aqf22saYZU5X)kb~5$$N)}xcX`vPy-_03)}<2
zD#`STvhidXGd&pkw40be$UD7PhxTkB8gZ?0u=fYt$1NA>Q~d5(2k#vnxmW73j`^~DdzM+&dO53STm##etv_+n$SKu=w
zrN6$!@!ks;xLuj~)W?lQHD8hG;IG;dU~Tc+7-$*^9;ic**Vc^wKnjOjMvASyMSCns
zT2K{oo9Y;#`mz4sV@?CXAOHd&00JNY0w4eaAOHd&00JQJJ|f`m`xIIKU$z{4{osdO
zzkcAW{HxBdJI~s;?Frk*ZL`+TbAM`C7LIuq-JgDEh2DKJ#(ST8uDMX4R_H=`ip)%;
z=%O@P3r>}{N=ilU6*1g8r_$Sw%z<^CV%}>NzagP(!j=`BPI>xd&V5!~$UIeJW^Nyg
z1=MtZe*N`Yl=lXM+{=PCk=rS-3#y^}!hE19s+?M>)>5r=QDWPkhJt)wleOh?NlBG9
zifKxrF$FG4F=NWhUq2e*y*K?_J8_L<&P1e0B-m==
z(+TL4u&t3@(`%Ejt%j76DX(Gw#jw-cd(oyfaY}4GAFM}0Je_skJ!hV0)XUUrE3{T%
zYa~_GAhD|K7zjh=RRq)ZKpJPmo*zq2j#-yE=jx
zWXY&Kid_Wc*L=yI8gtQ%T}0ikNOKAN^|R;5Zh+C2-2kT9d-J9ux^5ulLeYp4(pEqW
zJ5TEs*S5sO?gFO0OieGQH4noVZQ*U%k{uUwPxIcLQEs=-Snn{BbYzezXBAp+semY_
zgVC^TtaBKtw3V-fzT~EFP`jV>?w*ZB4a0r6a*%p%I3QaaMn>2&-965@OpN4hLY`{v
z6xw2GUS02RrjDRvds{o?z3*LmH)Kwv=X(FUW3$Z0CE9l9XuZf<);Rq2D`&|bu^?C9
zGT#o&LfE55K~5`$RFTwtAr+0Jv%zdI&8oeNa=T8mWi_&k-QJE_t#?U9xzL9nriiXU
zGEt-vPoH78^WC`l9$+p=7iW&vitl3aK$UOk>scq7>h95GSDDYeEmW7)+@9H73Cx5e
zAtfzG+6_*%_89Ha9qC){(9LXU(HoCm{`&br-kT!3%I3`Nq-opPNrciFC8ng?^FDbW
zY32%}ePTxU(_3O&iea(_ZM9=_>(BP))_Uk7@0Fk9>WkVft@Ght8#OgAg>X=c#-wzx
z%QL@bInvs2d)jq))bGQ+6trGt&rXoNk3_b<_pw)^=FpE^A;F*$C;f4(r=qj_RZg!Y
zI-WE+-G_K173qYR<7Ddu_Z+u-@;=;+R83$?I4#BGoW5l-`%6
zTJq5zE_!7~E5}eu?>5a25$pf&Y+eJYK>!3m00ck)1V8`;KmY_l00cnbaUg*4|Km_g
z&)X5_rfmAB_BQa>A(K<^hsjl7kTpgmkRl5WIdExX(3I!CpEjw
zvRuly*l8gRJKqUncV?6)LkhDqa@w#MeuAlTGFAGI3^!Hj=TCcCZcbg5$x2t%usg2V
z>8eb2x+*=ycZ{iWQdK4+s!Bf{JxVObqK+mj^2@Weoi(MYjFKT?J{ox82r(8fI!w?^
z<|c5>1c$W*CVHj>CW4Iw{zD|eXxP!fXtHjgY?z)JAf|)o>`XcR6}P5jdg2pE?3q!!
zF0~P_Yh)H4%|h4Ku+T-((ce4p;WHO
z>)V?vJ94g)4{z6`g7u7T#BA*U8apK%$DO*vtW;W#7vOFq%TJ1Kn{{R0T`k{9K
literal 0
HcmV?d00001
diff --git a/airtime_pap/manage.py b/airtime_pap/manage.py
new file mode 100644
index 0000000..0dfe400
--- /dev/null
+++ b/airtime_pap/manage.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == '__main__':
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'airtime_project.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)
From 47ffa0141aecb966de27aadaac96ea2ef9d16e4d Mon Sep 17 00:00:00 2001
From: Jeff
Date: Fri, 14 Sep 2018 17:38:41 +0300
Subject: [PATCH 2/8] AT sms API intergration and webapp design
---
airtime_pap/Pipfile | 15 +-
airtime_pap/Pipfile.lock | 35 +-
airtime_pap/airtime_app/forms.py | 12 +-
.../airtime_app/migrations/0001_initial.py | 54 +-
airtime_pap/airtime_app/models.py | 6 +-
.../airtime_app/css/bootstrap-grid.min.css | 7 +
.../airtime_app/css/responsive-styles.css | 255 +++++
.../static/airtime_app/css/styles.css | 932 ++++++++++++++++++
.../fonts/fanwood_text-webfont.woff | Bin 0 -> 51564 bytes
.../fonts/fanwood_text-webfont.woff2 | Bin 0 -> 40204 bytes
.../fonts/lindysdiner-webfont.woff | Bin 0 -> 33812 bytes
.../fonts/lindysdiner-webfont.woff2 | Bin 0 -> 29540 bytes
.../static/airtime_app/js/jquery.min.js | 5 +
.../airtime_app/static/airtime_app/js/main.js | 36 +
.../templates/airtime_app/base.html | 81 ++
.../templates/airtime_app/contacts.html | 67 +-
.../templates/airtime_app/create_contact.html | 48 +-
.../templates/airtime_app/form_snippet.html | 32 +-
.../templates/airtime_app/home.html | 51 +-
.../templates/airtime_app/send_airtime.html | 77 +-
.../airtime_app/send_airtime_success.html | 50 +
.../templates/airtime_app/signup.html | 51 +-
.../templates/registration/login.html | 49 +-
airtime_pap/airtime_app/tests.py | 29 +-
airtime_pap/airtime_app/urls.py | 19 +-
airtime_pap/airtime_app/views.py | 103 +-
airtime_pap/airtime_project/settings.py | 6 +-
airtime_pap/db.sqlite3 | Bin 151552 -> 51200 bytes
28 files changed, 1882 insertions(+), 138 deletions(-)
create mode 100644 airtime_pap/airtime_app/static/airtime_app/css/bootstrap-grid.min.css
create mode 100644 airtime_pap/airtime_app/static/airtime_app/css/responsive-styles.css
create mode 100644 airtime_pap/airtime_app/static/airtime_app/css/styles.css
create mode 100644 airtime_pap/airtime_app/static/airtime_app/fonts/fanwood_text-webfont.woff
create mode 100644 airtime_pap/airtime_app/static/airtime_app/fonts/fanwood_text-webfont.woff2
create mode 100644 airtime_pap/airtime_app/static/airtime_app/fonts/lindysdiner-webfont.woff
create mode 100644 airtime_pap/airtime_app/static/airtime_app/fonts/lindysdiner-webfont.woff2
create mode 100644 airtime_pap/airtime_app/static/airtime_app/js/jquery.min.js
create mode 100644 airtime_pap/airtime_app/static/airtime_app/js/main.js
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/base.html
create mode 100644 airtime_pap/airtime_app/templates/airtime_app/send_airtime_success.html
diff --git a/airtime_pap/Pipfile b/airtime_pap/Pipfile
index da9ef57..8a4f305 100644
--- a/airtime_pap/Pipfile
+++ b/airtime_pap/Pipfile
@@ -1,14 +1,21 @@
[[source]]
-url = "https://pypi.org/simple"
+
+url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
+
+[dev-packages]
+
+
+
[packages]
-django = "==2.1.1"
+
+django = "*"
africastalking = "*"
django-phonenumber-field = "*"
-[dev-packages]
[requires]
-python_version = "3.6"
+
+python_version = "3.5"
diff --git a/airtime_pap/Pipfile.lock b/airtime_pap/Pipfile.lock
index 1a72bc8..beeafeb 100644
--- a/airtime_pap/Pipfile.lock
+++ b/airtime_pap/Pipfile.lock
@@ -1,16 +1,29 @@
{
"_meta": {
"hash": {
- "sha256": "5ce77e79cd04ec1b93e0967e4301c3468766532dfb5c1f16e7cea5e60361b321"
+ "sha256": "fa7f90b29be03aae17bbe7eeee33bf8168e3b2b0dcf86ed9f058bd0998c0f603"
+ },
+ "host-environment-markers": {
+ "implementation_name": "cpython",
+ "implementation_version": "3.5.2",
+ "os_name": "posix",
+ "platform_machine": "i686",
+ "platform_python_implementation": "CPython",
+ "platform_release": "4.10.0-28-generic",
+ "platform_system": "Linux",
+ "platform_version": "#32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:13 UTC 2017",
+ "python_full_version": "3.5.2",
+ "python_version": "3.5",
+ "sys_platform": "linux"
},
"pipfile-spec": 6,
"requires": {
- "python_version": "3.6"
+ "python_version": "3.5"
},
"sources": [
{
"name": "pypi",
- "url": "https://pypi.org/simple",
+ "url": "https://pypi.python.org/simple",
"verify_ssl": true
}
]
@@ -20,7 +33,6 @@
"hashes": [
"sha256:d243f8b3de9c0951ec4caf9d032cdb2bb3f42cf5988984e369e129b2122cecb1"
],
- "index": "pypi",
"version": "==1.1.4"
},
"babel": {
@@ -32,15 +44,15 @@
},
"certifi": {
"hashes": [
- "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638",
- "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a"
+ "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a",
+ "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638"
],
"version": "==2018.8.24"
},
"chardet": {
"hashes": [
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+ "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691",
+ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
],
"version": "==3.0.4"
},
@@ -49,14 +61,12 @@
"sha256:04f2e423f2e60943c02bd2959174b844f7d1bcd19eabb7f8e4282999958021fd",
"sha256:e1cc1cd6b658aa4e052f5f2b148bfda08091d7c3558529708342e37e4e33f72c"
],
- "index": "pypi",
"version": "==2.1.1"
},
"django-phonenumber-field": {
"hashes": [
"sha256:08257904750d7329b2b11dd9d8d6b7ceb261980db555bb426d9900fa390e2a4c"
],
- "index": "pypi",
"version": "==2.0.1"
},
"idna": {
@@ -96,10 +106,9 @@
},
"urllib3": {
"hashes": [
- "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
- "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
+ "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5",
+ "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf"
],
- "markers": "python_version >= '2.6' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version < '4' and python_version != '3.3.*'",
"version": "==1.23"
}
},
diff --git a/airtime_pap/airtime_app/forms.py b/airtime_pap/airtime_app/forms.py
index 95921ea..a09d88a 100644
--- a/airtime_pap/airtime_app/forms.py
+++ b/airtime_pap/airtime_app/forms.py
@@ -1,6 +1,8 @@
from django.forms import ModelForm
+from django import forms
from .models import Contact
+
class CreateContactForm(ModelForm):
''' creates a new contact '''
@@ -10,11 +12,13 @@ class Meta:
labels = {
'first_name': 'First Name',
'last_name': 'Last Name',
- 'phone_number': 'Phone Number'
+ 'phone_number': 'Phone'
}
- help_texts = {
- 'phone_number': 'enter phone number in the format +2547XXXXXXXX'
- }
+ widgets = {
+ 'first_name': forms.TextInput(attrs={'placeholder': 'first name'}),
+ 'last_name': forms.TextInput(attrs={'placeholder': 'last name'}),
+ 'phone_number': forms.TextInput(attrs={'placeholder': 'phone number e.g +2547xxx12345'}),
+ }
diff --git a/airtime_pap/airtime_app/migrations/0001_initial.py b/airtime_pap/airtime_app/migrations/0001_initial.py
index dbaa26c..8814fbe 100644
--- a/airtime_pap/airtime_app/migrations/0001_initial.py
+++ b/airtime_pap/airtime_app/migrations/0001_initial.py
@@ -1,27 +1,27 @@
-# Generated by Django 2.1.1 on 2018-09-12 12:05
-
-from django.conf import settings
-from django.db import migrations, models
-import phonenumber_field.modelfields
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
- ]
-
- operations = [
- migrations.CreateModel(
- name='Contact',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('first_name', models.CharField(max_length=100)),
- ('last_name', models.CharField(max_length=100)),
- ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128)),
- ('owner', models.ManyToManyField(to=settings.AUTH_USER_MODEL)),
- ],
- ),
- ]
+# Generated by Django 2.1.1 on 2018-09-14 11:52
+
+from django.conf import settings
+from django.db import migrations, models
+import phonenumber_field.modelfields
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Contact',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('first_name', models.CharField(max_length=100)),
+ ('last_name', models.CharField(max_length=100)),
+ ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, unique=True)),
+ ('owner', models.ManyToManyField(to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/airtime_pap/airtime_app/models.py b/airtime_pap/airtime_app/models.py
index d9c4f46..4f19a1b 100644
--- a/airtime_pap/airtime_app/models.py
+++ b/airtime_pap/airtime_app/models.py
@@ -7,13 +7,13 @@
class Contact(models.Model):
'''
- defines a contact entry in the phonebook
- a contact is associated with a user
+ defines a contact entry in the phonebook.
+ A contact is associated with a user
'''
first_name = models.CharField(max_length = 100)
last_name = models.CharField(max_length = 100)
- phone_number = PhoneNumberField()
+ phone_number = PhoneNumberField(unique=True)
owner = models.ManyToManyField(User)
diff --git a/airtime_pap/airtime_app/static/airtime_app/css/bootstrap-grid.min.css b/airtime_pap/airtime_app/static/airtime_app/css/bootstrap-grid.min.css
new file mode 100644
index 0000000..ea073e9
--- /dev/null
+++ b/airtime_pap/airtime_app/static/airtime_app/css/bootstrap-grid.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap Grid v4.0.0 (https://getbootstrap.com)
+ * Copyright 2011-2018 The Bootstrap Authors
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */@-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}
+/*# sourceMappingURL=bootstrap-grid.min.css.map */
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/static/airtime_app/css/responsive-styles.css b/airtime_pap/airtime_app/static/airtime_app/css/responsive-styles.css
new file mode 100644
index 0000000..71f5d6d
--- /dev/null
+++ b/airtime_pap/airtime_app/static/airtime_app/css/responsive-styles.css
@@ -0,0 +1,255 @@
+
+/* Screens Resolution : 1680px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 1680px) {
+ html{
+ font-size: 12pt;
+ }
+}
+
+
+/* Screens Resolution : 1200px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 1280px) {
+
+ /* ---------------------------------
+ A. PRIMARY STYLES
+ --------------------------------- */
+ html{
+ font-size: 11pt;
+ }
+}
+
+
+/* Screens Resolution : 870px
+-------------------------------------------------------------------------- */
+@media only screen and (min-width: 870px) {
+ .menu-btn{
+ display: none;
+ }
+
+}
+
+/* Screens Resolution : 870px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 870px) {
+
+ .side-menu{
+ position: fixed;
+ z-index: 10000;
+ height: 100%;
+ top:0;
+ bottom: 0;
+
+ -webkit-transform: translateX(-200px);
+ -moz-transform: translateX(-200px);
+ -ms-transform: translateX(-200px);
+ -o-transform: translateX(-200px);
+ transform: translateX(-200px);
+ }
+
+
+ p{
+ font-size: 18px;
+ line-height: 1.5;
+ }
+
+ .main .content{
+
+ }
+
+ .item{
+ margin-right: 10px;
+ }
+
+ .main .content{
+ margin: 0;
+ width: 100%;
+ padding: 100px 30px 20px;
+ }
+
+ /*send airtime page */
+ .send-airtime-btn{
+ left: 0;
+ padding: 10px 10px 15px;
+ }
+
+ .send-airtime-btn input{
+ width: 60%;
+ margin-bottom: 5px;
+ }
+}
+
+
+
+/* Screens Resolution : 767px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 767px) {
+
+ .side-menu{
+ /*width: 300px;*/
+ }
+
+ .item{
+ width: 120px;
+ height: 120px;
+ line-height: 120px;
+ margin-bottom: 40px;
+ }
+
+ .item i{
+ font-size: 30px;
+ }
+
+ .main .content{
+ margin: 0;
+ width: 100%;
+ padding: 100px 10px 20px;
+ }
+
+ /* form pages */
+
+ .generic-container{
+ padding: 0;
+ }
+ .content-container{
+ width: 100%;
+ margin: 0;
+ }
+
+ .content-contacts{
+ padding: 20px 0 10px 0;
+ /*font-size: 15px;*/
+ }
+
+}
+
+
+/* Screens Resolution : 567px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 567px) {
+
+ .main .content{
+ margin: 0;
+ width: 100%;
+ padding: 90px;
+ }
+
+ /* contacts page */
+ .content-contacts{
+ font-size: 18px;
+ }
+
+ .content-contacts span{
+ margin-right: 10px;
+ }
+
+ /*send airtime page*/
+
+ table{
+ width: 100%;
+ }
+
+ .content-send-airtime{
+ padding: 20px 0px;
+ }
+
+ .send-airtime-btn input{
+ width: 80%;
+ margin-bottom: 5px;
+ }
+
+}
+
+/* Screens Resolution : 450px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 450px) {
+
+ .profile-icon{
+ width: 50px;
+ height: 50px;
+ line-height: 50px;
+ }
+
+ .profile-icon i{
+ font-size: 30px;
+ }
+
+ .main .content{
+ padding: 50px;
+ }
+
+ .item{
+ height: 110px;
+ width: 110px;
+ line-height: 110px;
+ }
+
+ .item i{
+ font-size: 25px;
+ }
+
+ /* contacts page*/
+ .content-contacts{
+ padding: 20px 0 10px 0;
+ font-size: 15px;
+ }
+
+ .content-contacts .contact{
+ padding: 10px 0;
+ }
+
+ .name-initial{
+ width: 40px;
+ height: 40px;
+ line-height:40px;
+ }
+
+ .content-contacts span{
+ display: inline-block;
+ margin-right: 10px;
+ }
+
+ /* send airtime page */
+
+ table td{
+ padding: 10px;
+ }
+
+ table .table-cell{
+ padding-left: 20px;
+ }
+
+ table .table-last-cell{
+ padding-right: 20px;
+ }
+
+ /*form pages*/
+ form input {
+ padding: 15px 50px;
+ }
+
+ form{
+ padding: 10px;
+ }
+
+
+/* Screens Resolution : 359px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 359px) {
+
+ html{
+ font-size: 10pt;
+ }
+
+ .main .content{
+ padding: 30px;
+ }
+
+}
+
+/* Screens Resolution : 290px
+-------------------------------------------------------------------------- */
+@media only screen and (max-width: 290px) {
+
+}
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/static/airtime_app/css/styles.css b/airtime_pap/airtime_app/static/airtime_app/css/styles.css
new file mode 100644
index 0000000..70e490d
--- /dev/null
+++ b/airtime_pap/airtime_app/static/airtime_app/css/styles.css
@@ -0,0 +1,932 @@
+/* ---------------------------------
+ A. RESET
+--------------------------------- */
+
+
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+
+article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+
+
+body {
+ line-height: 1;
+}
+
+p{
+ font-size: 20px;
+ line-height: 1.7;
+}
+
+ol, ul {
+ list-style: none;
+}
+
+blockquote, q {
+ quotes: none;
+}
+
+blockquote:before, blockquote:after, q:before, q:after {
+ content: '';
+ content: none;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+body {
+ -webkit-text-size-adjust: none;
+}
+
+/* Box Model */
+
+*, *:before, *:after {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+/* ---------------------------------
+ FONTS
+--------------------------------- */
+
+@font-face {
+ font-family: 'fanwood_textregular';
+ src: url('../fonts/fanwood_text-webfont.woff2') format('woff2'),
+ url('../fonts/fanwood_text-webfont.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
+
+
+@font-face {
+ font-family: 'lindysdinermedium';
+ src: url('../fonts/lindysdiner-webfont.woff2') format('woff2'),
+ url('../fonts/lindysdiner-webfont.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+/*---------------------------------
+ UTILITIES
+--------------------------------- */
+
+/*Bootstrap container override*/
+.container{
+ padding: 0;
+}
+
+
+/* ---------------------------------
+ A. PAGE STYLES
+--------------------------------- */
+
+html{
+ font-size: 16pt;
+ position: relative;
+}
+
+html, body{
+ height: 100%;
+}
+
+body{
+ background-color: #D1D8DF;
+ color: #212931;
+ font-family: 'fanwood_textregular', Georgia, serif;
+ font-weight: 400;
+}
+
+body, input, select, textarea {
+ font-family: 'fanwood_textregular', Georgia, serif;
+ font-weight: 300;
+ font-size: 1rem;
+ line-height: 2.375;
+}
+
+a {
+ -moz-transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ -webkit-transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ -ms-transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ text-decoration: none;
+ color: #62b5cc;
+ font-weight: bold;
+}
+
+a:hover{
+ border-bottom: dotted 1px;
+ text-decoration: none;
+}
+
+strong, b {
+ font-weight: 600;
+}
+
+em, i {
+ font-style: italic;
+}
+
+p {
+ margin: 0 0 2rem 0;
+ font-size: 20px;
+ line-height: 1.7;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Source Sans Pro", Helvetica, sans-serif;
+ font-weight: 900;
+ line-height: 1.5;
+ letter-spacing: 0.075em;
+ color: #212931;
+ text-transform: uppercase;
+ margin: 0 0 1rem 0;
+}
+
+h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
+ border-bottom: 0;
+ color: inherit;
+ text-decoration: none;
+}
+
+h1 {
+ font-size: 3rem;
+ line-height: 1.1;
+ margin: 0 0 2rem 0;
+}
+
+h2 {
+ font-size: 1.75rem;
+ line-height: 1.3;
+ margin: 0 0 1.5rem 0;
+}
+
+h3 {
+ font-size: 1.25rem;
+ margin: 0 0 1.5rem 0;
+}
+
+h4 {
+ font-size: 1rem;
+}
+
+h5 {
+ font-size: 0.9rem;
+}
+
+h6 {
+ font-size: 0.8rem;
+}
+
+sub, sup{
+ font-size: 0.8rem;
+}
+
+b, strong{
+ color: #ac68cc;
+}
+
+hr {
+ border: 0;
+ border-bottom: 2px solid #eeeeee;
+ margin: 1rem 0;
+}
+
+
+ol {
+ list-style: decimal;
+ margin: 0 0 2rem 0;
+ padding-left: 1.25rem;
+}
+
+ol li {
+ padding-left: 0.25rem;
+}
+
+ul {
+ list-style: disc;
+ margin: 0 0 2rem 0;
+ padding-left: 1rem;
+}
+
+ul li {
+ padding-left: 0.5rem;
+}
+
+
+dl {
+ margin: 0 0 2rem 0;
+}
+
+dl dt {
+ display: block;
+ font-weight: 600;
+ margin: 0 0 1rem 0;
+}
+
+dl dd {
+ margin-left: 2rem;
+}
+
+/*icons*/
+
+ul.icons {
+ cursor: default;
+ list-style: none;
+ padding-left: 0;
+}
+
+ul.icons li {
+ display: inline-block;
+ padding: 0 0.8rem 0 0;
+ vertical-align: middle;
+}
+
+ul.icons li:last-child {
+ padding-right: 0;
+}
+
+ul.icons li .icon{
+ border-bottom: none;
+ color: #212931;
+}
+
+ul.icons li .icon:before {
+ width: 2.25rem;
+ height: 2.25rem;
+ line-height: 2.25rem;
+ display: inline-block;
+ text-align: center;
+ border-radius: 100%;
+ font-size: 1.25rem;
+}
+
+ul.icons li a.icon:hover:before {
+ color: #18bfef;
+}
+
+ul.icons.alt li .icon{
+ color: rgba(64, 28, 115, 0.8);
+}
+
+
+
+ul.icons.alt li .icon:before {
+ -moz-transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ -webkit-transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ -ms-transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out, border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
+ font-size: 1rem;
+ box-shadow: inset 0 0 0 2px rgba(64, 28, 115, 0.7);
+}
+
+
+ul.icons.alt li a.icon:hover:before {
+ box-shadow: inset 0 0 0 2px #18bfef;
+}
+
+/* buttons */
+button, .button{
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ -ms-appearance: none;
+ appearance: none;
+ -moz-transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;
+ -webkit-transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;
+ -ms-transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;
+ transition: background-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, color 0.2s ease-in-out;
+ border: 0;
+ cursor: pointer;
+ display: inline-block;
+ font-family: "Source Sans Pro", Helvetica, sans-serif;
+ font-size: 0.8rem;
+ font-weight: 900;
+ letter-spacing: 0.075em;
+ height: 3rem;
+ line-height: 3rem;
+ padding: 0 2rem;
+ text-align: center;
+ text-decoration: none;
+ text-transform: uppercase;
+ white-space: nowrap;
+ background-color: transparent;
+ color: rgba(64, 28, 115, 0.9) !important;
+ box-shadow: inset 0 0 0 2px rgba(64, 28, 115, 0.9);
+}
+
+.button:hover{
+ box-shadow: inset 0 0 0 2px #ac68cc;
+ color: #ac68cc !important;
+}
+
+div.actions{
+ margin-bottom: 2rem;
+}
+
+div.actions span{
+ display: inline-block;
+ padding: 0 1rem 0 0;
+ vertical-align: middle;
+}
+
+div.actions.small a {
+ font-size: 0.7rem;
+ height: 2.5rem;
+ line-height: 2.5rem;
+ padding: 0 1.5rem;
+}
+
+.button.special{
+ background-color: rgba(64, 28, 115, 0.9);
+ color: #fff !important;
+ box-shadow: none;
+}
+
+.button.special:hover{
+ background-color: #ac68cc;
+}
+
+/*blockquote*/
+blockquote{
+ border-left: solid 4px #eee;
+ font-style: italic;
+ margin: 0 0 2rem 0;
+ padding: 0.5rem 0 0.5rem 2rem;
+}
+
+/* Form */
+
+.form-control {
+ border:1px solid #ddd;
+ border-radius: 0;
+ box-shadow: none;
+ color: #444;
+ padding: 15px 25px 15px 50px;
+ letter-spacing: 0;
+ margin-bottom: 30px;
+ min-height: 50px;
+ font-size: 14px;
+
+ background: transparent none repeat scroll 0 0;
+}
+
+.form-control:focus{
+ border: 1px solid #ac68cc;
+}
+
+.has-error .form-control {
+ border: 1px solid #ec7160;
+ color: #ec7160;
+}
+
+.help-block.with-errors li {
+ color: #ec7160;
+ font-size: 13px;
+ margin-bottom: 0;
+ margin-top: -30px;
+}
+
+.contact-icon {
+ color: #793698;
+ position: absolute;
+ left: 34px;
+ top: 23px;
+}
+
+.contact-form textarea {
+ background: transparent none repeat scroll 0 0;
+ border: 1px solid #ddd;
+ color: #444;
+ height: 268px;
+ margin-bottom: 20px;
+ padding: 18px;
+ resize: vertical;
+ width: 100%;
+}
+
+/* ---------------------------------
+ main container
+--------------------------------- */
+
+.element-container{
+ display: flex;
+ flex-direction: row;
+ min-height: 100%;
+}
+
+/* ---------------------------------
+ SIDE MENU
+--------------------------------- */
+
+/* when menu is closed*/
+#sideMenu.menu-asleep{
+ -webkit-transform: translateX(0px);
+ -moz-transform: translateX(0px);
+ -ms-transform: translateX(0px);
+ -o-transform: translateX(0px);
+ transform: translateX(0px);
+}
+
+.menu-asleep .menu-btn i{
+
+}
+
+
+/*when menu is open*/
+.side-menu{
+ background-color: #343949;
+ color: #A6B4C5 !important;
+ padding: 15px 0;
+ width: 200px;
+ font-size: 15px;
+ position: relative;
+
+ -webkit-transition: transform 0.5s ease 0s;
+ -o-transition: transform 0.5s ease 0s;
+ transition: transform 0.5s ease 0s;
+
+}
+
+.side-menu .menu-btn{
+ position: absolute;
+ top: 0;
+ right: -50px;
+ height: 40px;
+ z-index: 1000;
+ width: 50px;
+ background-color: #45BCC2;
+ color: #fff;
+ text-align: center;
+ cursor: pointer;
+}
+
+.side-menu .menu-btn:hover{
+ background-color: #292E3F;
+}
+
+.side-menu .menu-btn i{
+ font-size: 30px;
+
+ -webkit-transform: translateX(0px);
+ -moz-transform: translateX(0px);
+ -ms-transform: translateX(0px);
+ -o-transform: translateX(0px);
+ transform: rotate(45deg);
+
+ -webkit-transition: transform 0.5s ease 0s;
+ -o-transition: transform 0.5s ease 0s;
+ transition: transform 0.5s ease 0s;
+}
+
+.profile-icon{
+ position: relative;
+ display: block;
+ width: 75px;
+ height: 75px;
+ line-height: 75px;
+ border-radius: 100%;
+ background-color: #45BCC2;
+ margin: 0 auto;
+}
+
+.profile-icon i{
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+
+ color: #D1D8DF;
+ text-align: center;
+ font-size: 45px;
+}
+
+.user-name{
+ position: relative;
+ display: block;
+ text-align: center;
+ padding-top: 10px;
+}
+
+.user-name-icon{
+ display: inline-block;
+ padding: 2px 0 0 2px;
+ vertical-align: -10%;
+}
+
+.side-menu hr{
+ border-bottom-color: rgba(95, 116, 145, 0.2);
+}
+
+.side-menu-main h6{
+ color: #A6B4C5 !important;
+ font-size: 9px;
+ font-weight: normal;
+ padding-left: 20px;
+}
+
+.side-menu-main a{
+ display: block;
+ padding: 5px 0px 5px 25px;
+ color: #A6B4C5 !important;
+ font-weight: normal;
+}
+
+.side-menu-main a.active{
+ background-color: #292E3F;
+ border-left: 4px solid #45BCC2;
+}
+
+
+.side-menu-main a:hover{
+ background-color: #3B5367;
+ border: none;
+}
+
+.side-menu-main a i{
+ padding-right: 7px;
+}
+
+/* ---------------------------------
+ MAIN
+--------------------------------- */
+
+.main{
+ flex-grow: 2;
+}
+
+.top-main-menu{
+ padding: 20px 20px 20px 50px;
+ background-color: #fff;
+ width: 100%;
+ position: relative;
+ padding-top: 60px;
+}
+
+.top-main-menu .github-icon{
+ position: absolute;
+ top: 5px;
+ right: 30px;
+ color: #292E3F;
+}
+
+.top-main-menu .github-icon i{
+ font-size: 25px;
+}
+
+.top-main-menu hr{
+ position: absolute;
+ left: 0;
+ right: 0;
+ margin:0;
+ border-bottom-color: #292E3F;
+}
+
+.top-main-menu .top-hr{
+ top: 40px;
+}
+
+.top-main-menu .bottom-hr{
+ bottom: 0px;
+}
+
+.top-main-menu h2{
+ margin-bottom: 5px;
+ color: #292E3F;
+}
+
+.top-main-menu p {
+ font-size: 17px;
+}
+
+.top-main-menu p span{
+ display: inline-block;
+ margin-right: 7px;
+}
+
+.top-main-menu p a{
+ color: #A5C7D6;
+}
+
+/* ---------------------------------
+ HOME
+--------------------------------- */
+
+
+.main .content{
+ padding: 50px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ align-items: center;
+ height: 70%;
+ /*width: 60%;*/
+ /*margin: 0 auto;*/
+}
+
+.item{
+ width: 150px;
+ height: 150px;
+ line-height: 150px;
+ display: inline-block;
+ text-align: center;
+ border-radius: 100%;
+ color: #292E3F;
+ margin-bottom: 50px;
+ margin-right: 20px;
+}
+
+.item:hover{
+ border: none;
+ color: #fff;
+}
+
+.item i{
+ vertical-align: middle;
+ font-size: 50px;
+}
+
+.item i::after{
+ font-size: 13px;
+ display: block;
+ margin-top: 10px;
+}
+
+.item span{
+ display: block;
+ font-size: 13px;
+}
+
+#item-contact{
+ box-shadow: inset 0 0 0 5px rgb(65, 147, 255);
+}
+
+#item-contact:hover{
+ background-color: rgb(65, 147, 255);
+}
+
+#item-contact i::after{
+ content: 'view contacts';
+}
+
+
+#item-send-airtime{
+ box-shadow: inset 0 0 0 5px #45BCC2;
+}
+
+#item-send-airtime:hover{
+ background-color: #45BCC2;
+}
+
+#item-send-airtime i::after{
+ content: 'send airtime'
+}
+
+#item-add-contact{
+ box-shadow: inset 0 0 0 5px #9A92A7;
+}
+
+#item-add-contact:hover{
+ background-color: #9A92A7;
+}
+
+#item-add-contact i::after{
+ content: 'add contact';
+}
+
+#item-logout{
+ box-shadow: inset 0 0 0 5px #DCAA96;
+}
+
+#item-logout:hover{
+ background-color: #DCAA96;
+}
+
+#item-logout i::after{
+ content: 'logout';
+}
+
+
+
+
+/* ---------------------------------
+ CONTACTS LIST
+--------------------------------- */
+
+.content-contacts{
+ padding: 50px 10px 10px 90px;
+ font-size: 20px;
+}
+
+.content-contacts .contact{
+ padding: 15px;
+ /*text-align: center;*/
+}
+
+.content-contacts span{
+ display: inline-block;
+ margin-right: 30px;
+}
+
+.name-initial{
+ width: 60px;
+ height: 60px;
+ line-height: 60px;
+ border-radius: 100%;
+ background-color: #45BCC2;
+ color: #fff;
+ text-align: center;
+ font-weight: bold;
+}
+
+.side-menu{
+ /*display: none;*/
+}
+
+
+/* ---------------------------------------
+ SEND AIRTIME AND VIEW CONTACTS PAGES
+------------------------------------------ */
+
+.content-send-airtime{
+ padding: 50px;
+ position: relative;
+}
+
+
+table{
+ background-color: #fff;
+ margin:0 auto;
+}
+
+table tr{
+ border-bottom: 1px solid #A6B4C5;
+}
+
+table td{
+ padding: 20px;
+}
+
+table .table-head{
+ background-color: #292E3F;
+ color: #A6B4C5 !important;
+ text-align: center;
+}
+
+table .table-cell{
+ padding-left: 60px;
+}
+
+table .table-last-cell{
+ padding-right: 60px;
+}
+
+.send-airtime-btn{
+ position: fixed;
+ bottom: 0;
+ left: 200px;
+ width: 100%;
+ display: block;
+ text-align: center;
+
+ padding: 20px;
+ background-color: rgba(69, 188, 194, 0.8);
+}
+
+.send-airtime-btn input{
+ width: 500px;
+ margin-right: 10px;
+}
+
+button{
+ display: inline-block;
+ font-size: 0.8rem;
+ font-weight: 900;
+ letter-spacing: 0.075em;
+ height: 3rem;
+ line-height: 3rem;
+ padding: 0 2rem;
+ text-align: center;
+ text-decoration: none;
+ text-transform: uppercase;
+ white-space: nowrap;
+ background-color: #292E3F;
+ color: #A6B4C5 !important;
+ box-shadow: none;
+}
+
+button:hover{
+ background-color: #3B5367;
+}
+
+
+
+/* add contact page*/
+
+form{
+ margin-top: 15px;
+}
+
+form input {
+ border:1px solid #ddd;
+ border-radius: 0;
+ box-shadow: none;
+ color: #292E3F;
+ padding: 15px 70px;
+ letter-spacing: 0;
+ margin-bottom: 10px;
+ min-height: 50px;
+ font-size: 15px;
+
+ background: transparent none repeat scroll 0 0;
+}
+
+.generic-container{
+ padding: 50px;
+}
+
+.content-container{
+ width: 600px;
+ margin: 0 auto;
+ background-color: #fff;
+ text-align: center;
+}
+
+.content-container-meta{
+ padding: 10px;
+ background-color: #292E3F;
+ color: #A6B4C5 !important;
+ text-align: center;
+ display: block;
+}
+
+.content-container-meta-other{
+ padding: 5px 10px;
+ background-color: rgba(69, 188, 194, 1);
+ color: #292E3F;
+ display: inline-block;
+ text-align: center;
+}
+
+.content-container-meta-other a{
+ color: #fff;
+ padding: 1px 3px;
+ background-color: rgb(65, 147, 255);
+ display: inline-block;
+ margin-left: 5px;
+
+}
+
+.content-container form {
+ padding: 20px;
+}
+
+.content-container form label{
+ display: none;
+}
+
+#errors{
+ text-align: left;
+}
+
+#errors p{
+ margin-bottom: 10px;
+}
+
+#errors ul li{
+ color: red;
+}
+
+/* send airtime success page */
+.transaction-log-cont{
+ padding: 20px 10px 5px;
+ text-align: left;
+}
+
+.transaction-success-icon{
+ font-size: 20px;
+ display: inline-block;
+ margin-right: 15px;
+}
+
+.transaction-amt, .transaction-number, .transaction-discount{
+ display: inline-block;
+ padding: 0 7px;
+ color: rgba(69, 188, 194, 1);
+}
+
+
+
+#no-contacts-cont{
+ padding: 60px 15px 100px;
+}
\ No newline at end of file
diff --git a/airtime_pap/airtime_app/static/airtime_app/fonts/fanwood_text-webfont.woff b/airtime_pap/airtime_app/static/airtime_app/fonts/fanwood_text-webfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..cfd20016e0e271981783e8b86c717626d0065eeb
GIT binary patch
literal 51564
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