├── README.md └── blogpost ├── Blog ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-311.pyc │ ├── admin.cpython-311.pyc │ ├── apps.cpython-311.pyc │ ├── forms.cpython-311.pyc │ ├── models.cpython-311.pyc │ └── views.cpython-311.pyc ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-311.pyc │ │ └── __init__.cpython-311.pyc ├── models.py ├── tests.py └── views.py ├── Blogpost ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-311.pyc │ ├── settings.cpython-311.pyc │ ├── urls.cpython-311.pyc │ └── wsgi.cpython-311.pyc ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── static └── assets │ ├── css │ ├── googlefonts.css │ └── styles.css │ ├── favicon.ico │ ├── img │ ├── about-bg.jpg │ ├── contact-bg.jpg │ ├── home-bg.jpg │ ├── login-bg.jpg │ ├── post-bg.jpg │ ├── post-sample-image.jpg │ ├── signup-bg.jpg │ └── story-bg.jpg │ └── js │ ├── fontawesome.js │ └── scripts.js └── templates ├── about.html ├── addBlog.html ├── base.html ├── contact.html ├── index.html ├── navbar.html ├── post.html ├── signin.html └── signup.html /README.md: -------------------------------------------------------------------------------- 1 | # Django Simple Blog 2 | Welcome to the Django Simple Blog application! This web app allows users to register, log in, and post their blogs. 3 | ## Features 4 | - User Registration: Users can create an account by providing a username, email, first name, last name, and password. 5 | - User Authentication: Registered users can log in securely. 6 | - Blog Post Creation: Authenticated users can create and publish blog posts. 7 | - List and Detail Views: Display a list of all blog posts and view the details of each post. 8 | - only authenticated user can see their post. 9 | 10 | ## Installation 11 | 12 | 1. Clone the repository: 13 | ``` 14 | git clone https://github.com/HashimThePassionate/BlogProject.git 15 | ``` 16 | #### Enjoy! 17 | -------------------------------------------------------------------------------- /blogpost/Blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__init__.py -------------------------------------------------------------------------------- /blogpost/Blog/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/__pycache__/admin.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__pycache__/admin.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/__pycache__/apps.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__pycache__/apps.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/__pycache__/forms.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__pycache__/forms.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/__pycache__/models.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__pycache__/models.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/__pycache__/views.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/__pycache__/views.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import contactTable, Blog 3 | @admin.register(contactTable) 4 | class studentAdmin(admin.ModelAdmin): 5 | list_display=('id','name','email','phoneno','message') 6 | 7 | @admin.register(Blog) 8 | class BlogAdmin(admin.ModelAdmin): 9 | list_display=('id','title','des','author') -------------------------------------------------------------------------------- /blogpost/Blog/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BlogConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'Blog' 7 | -------------------------------------------------------------------------------- /blogpost/Blog/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from Blog.models import Blog 3 | from django.contrib.auth.forms import UserCreationForm, AuthenticationForm 4 | from django.contrib.auth.models import User 5 | class contact(forms.Form): 6 | name = forms.CharField(max_length=50,error_messages={'required':'Please Enter Your Name'},widget=forms.TextInput(attrs={'class':'form-control','placeholder': 'Name'})) 7 | email = forms.EmailField(max_length=254,error_messages={'required':'Please Enter Your Email'},widget=forms.EmailInput(attrs={'class':'form-control','placeholder': 'Email'})) 8 | phoneno = forms.CharField(max_length=150,widget=forms.TextInput(attrs={'class':'form-control','placeholder': 'PhoneNo'}),required=False) 9 | message = forms.CharField(max_length=500,widget=forms.Textarea(attrs={'class':'form-control','placeholder': 'Message'}),required=False) 10 | 11 | 12 | class sigupContactForm(UserCreationForm): 13 | password1=forms.CharField(min_length=8, max_length=60,widget=forms.PasswordInput(attrs={'class':'form-control','id':'password1','placeholder': 'Password'}),label="Password") 14 | password2=forms.CharField(min_length=8, max_length=60,widget=forms.PasswordInput(attrs={'class':'form-control','id':'password2','placeholder': 'Confirm Password'}),label="Confirm Password") 15 | 16 | class Meta: 17 | model = User 18 | fields = ['username','email','first_name','last_name'] 19 | widgets= { 20 | 'username':forms.TextInput(attrs={'class':'form-control','placeholder': 'Username'}), 21 | 'email':forms.TextInput(attrs={'class':'form-control','placeholder': 'Email'}), 22 | 'first_name':forms.TextInput(attrs={'class':'form-control','placeholder': 'First Name'}), 23 | 'last_name':forms.TextInput(attrs={'class':'form-control','placeholder': 'Last Name'}), 24 | } 25 | 26 | 27 | class signin(AuthenticationForm): 28 | username = forms.CharField(max_length=150,widget=forms.TextInput(attrs={'class':'form-control','placeholder': 'Username'})) 29 | password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control','placeholder': 'Password'})) 30 | 31 | 32 | 33 | class BlogForm(forms.ModelForm): 34 | class Meta: 35 | model = Blog 36 | fields = ['title','des'] 37 | labels = {'title':'Title','des':'Description'} 38 | widgets= { 39 | 'title':forms.TextInput(attrs={'class':'form-control'}), 40 | 'des':forms.Textarea(attrs={'placeholder':'Description','class':'form-control'}) 41 | } -------------------------------------------------------------------------------- /blogpost/Blog/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.6 on 2023-11-15 18:46 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='contactTable', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('name', models.CharField(max_length=50)), 22 | ('email', models.EmailField(max_length=254)), 23 | ('phoneno', models.IntegerField()), 24 | ('message', models.TextField()), 25 | ], 26 | ), 27 | migrations.CreateModel( 28 | name='Blog', 29 | fields=[ 30 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 31 | ('title', models.CharField(max_length=150)), 32 | ('des', models.TextField(max_length=100)), 33 | ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 34 | ], 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /blogpost/Blog/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/migrations/__init__.py -------------------------------------------------------------------------------- /blogpost/Blog/migrations/__pycache__/0001_initial.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/migrations/__pycache__/0001_initial.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/migrations/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blog/migrations/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blog/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | # Create your models here. 4 | class contactTable(models.Model): 5 | name = models.CharField(max_length=50) 6 | email = models.EmailField(max_length=254) 7 | phoneno = models.IntegerField() 8 | message = models.TextField() 9 | 10 | 11 | class Blog(models.Model): 12 | title = models.CharField(max_length=150) 13 | des = models.TextField(max_length=100) 14 | author = models.ForeignKey(User, on_delete=models.CASCADE) 15 | 16 | 17 | -------------------------------------------------------------------------------- /blogpost/Blog/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /blogpost/Blog/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect 2 | from Blog.forms import contact, sigupContactForm, signin ,BlogForm 3 | from Blog.models import contactTable, Blog 4 | from django.contrib import messages 5 | from django.contrib.auth.models import Group 6 | from django.contrib.auth.forms import AuthenticationForm 7 | from django.contrib.auth.decorators import login_required 8 | from django.contrib.auth import authenticate, logout, update_session_auth_hash, login 9 | # Create your views here. 10 | def home_page(request): 11 | return render(request,'index.html') 12 | 13 | def about_page(request): 14 | return render(request,'about.html') 15 | 16 | def blog_page(request): 17 | if request.user.is_authenticated: 18 | if request.user.is_superuser: 19 | get = Blog.objects.all() 20 | else: 21 | get = Blog.objects.filter(author=request.user) 22 | return render(request,'post.html',{'blog':get}) 23 | else: 24 | return redirect('/signin/') 25 | 26 | def addBlog_page(request): 27 | if request.user.is_authenticated: 28 | if request.method =='POST': 29 | form = BlogForm(request.POST) 30 | if form.is_valid(): 31 | title = form.cleaned_data['title'] 32 | des = form.cleaned_data['des'] 33 | blog = form.save(commit=False) 34 | blog.author = request.user 35 | blog.save() 36 | return redirect('/blog/',pk=blog.pk) 37 | else: 38 | form = BlogForm(auto_id=True) 39 | return render(request,'addBlog.html',{'form':form}) 40 | else: 41 | return redirect('/signin/') 42 | 43 | def delete_page(request,id): 44 | db = Blog.objects.get(pk=id) 45 | try: 46 | db.delete() 47 | except: 48 | return ('/blog/') 49 | return redirect('/blog/') 50 | 51 | def update_page(request,id): 52 | row = Blog.objects.get(pk=id) 53 | if request.method =='POST': 54 | form = BlogForm(request.POST,instance=row) 55 | if form.is_valid(): 56 | form.save() 57 | return redirect('/blog/') 58 | else: 59 | form = BlogForm(instance=row) 60 | return render(request,'addBlog.html',{'form':form}) 61 | 62 | 63 | 64 | def contact_page(request): 65 | if request.method =='POST': 66 | form = contact(request.POST) 67 | if form.is_valid(): 68 | name = form.cleaned_data['name'] 69 | email = form.cleaned_data['email'] 70 | phoneno = form.cleaned_data['phoneno'] 71 | message = form.cleaned_data['message'] 72 | CT = contactTable(name=name,email=email,phoneno=phoneno,message=message) 73 | CT.save() 74 | messages.add_message(request,messages.SUCCESS,"Thank You For Contacting Us, we will get back soon!") 75 | else: 76 | form = contact(auto_id=True) 77 | return render(request,'contact.html',{'form':form}) 78 | 79 | 80 | def signup_page(request): 81 | if request.method == "POST": 82 | form = sigupContactForm(request.POST) 83 | if form.is_valid(): 84 | user=form.save() 85 | get = Group.objects.get(name='Editor') 86 | user.groups.add(get) 87 | messages.add_message(request,messages.SUCCESS,"Congratulations Your Account Has Been CreatedSuccessfully!") 88 | else: 89 | # form =csigupContactForm() 90 | form = sigupContactForm() 91 | return render(request,'signup.html',{'form':form}) 92 | 93 | def signin_page(request): 94 | if not request.user.is_authenticated: 95 | if request.method == "POST": 96 | form = signin(request=request.user,data=request.POST) 97 | if form.is_valid(): 98 | username = request.POST["username"] 99 | password = request.POST["password"] 100 | user = authenticate(request, username=username, password=password) 101 | if user is not None: 102 | login(request, user) 103 | return redirect('/blog/') 104 | else: 105 | return redirect('/signin/') 106 | 107 | else: 108 | form = signin() 109 | else: 110 | return redirect('/blog/') 111 | return render(request,'signin.html',{'form':form}) 112 | 113 | def signout_page(request): 114 | logout(request) 115 | return redirect('/signin/') 116 | -------------------------------------------------------------------------------- /blogpost/Blogpost/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blogpost/__init__.py -------------------------------------------------------------------------------- /blogpost/Blogpost/__pycache__/__init__.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blogpost/__pycache__/__init__.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blogpost/__pycache__/settings.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blogpost/__pycache__/settings.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blogpost/__pycache__/urls.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blogpost/__pycache__/urls.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blogpost/__pycache__/wsgi.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/Blogpost/__pycache__/wsgi.cpython-311.pyc -------------------------------------------------------------------------------- /blogpost/Blogpost/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for Blogpost project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Blogpost.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /blogpost/Blogpost/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for Blogpost project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.2.6. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.2/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 16 | BASE_DIR = Path(__file__).resolve().parent.parent 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'django-insecure-bulwaq9lnh0eq0^a6(gky@%ya*777uvcl74c!(zkgi5#l9sp&!' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'Blog', 41 | ] 42 | 43 | MIDDLEWARE = [ 44 | 'django.middleware.security.SecurityMiddleware', 45 | 'django.contrib.sessions.middleware.SessionMiddleware', 46 | 'django.middleware.common.CommonMiddleware', 47 | 'django.middleware.csrf.CsrfViewMiddleware', 48 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 49 | 'django.contrib.messages.middleware.MessageMiddleware', 50 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 51 | ] 52 | 53 | ROOT_URLCONF = 'Blogpost.urls' 54 | TEMPLATE_DIR = os.path.join(BASE_DIR,'templates') 55 | TEMPLATES = [ 56 | { 57 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 58 | 'DIRS': [TEMPLATE_DIR], 59 | 'APP_DIRS': True, 60 | 'OPTIONS': { 61 | 'context_processors': [ 62 | 'django.template.context_processors.debug', 63 | 'django.template.context_processors.request', 64 | 'django.contrib.auth.context_processors.auth', 65 | 'django.contrib.messages.context_processors.messages', 66 | ], 67 | }, 68 | }, 69 | ] 70 | 71 | WSGI_APPLICATION = 'Blogpost.wsgi.application' 72 | 73 | 74 | # Database 75 | # https://docs.djangoproject.com/en/4.2/ref/settings/#databases 76 | 77 | DATABASES = { 78 | 'default': { 79 | 'ENGINE': 'django.db.backends.mysql', 80 | 'NAME': 'blog', # Replace with your database name 81 | 'USER': 'root', # Replace with your database user 82 | 'PASSWORD': 'hashim', # Replace with your database password 83 | 'HOST': 'localhost', # Replace with your database host (e.g., 'localhost' or an IP address) 84 | 'PORT': '3306', # Replace with your database port (MySQL default is 3306) 85 | } 86 | } 87 | 88 | 89 | # Password validation 90 | # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators 91 | 92 | AUTH_PASSWORD_VALIDATORS = [ 93 | { 94 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 95 | }, 96 | { 97 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 98 | }, 99 | { 100 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 101 | }, 102 | { 103 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 104 | }, 105 | ] 106 | 107 | 108 | # Internationalization 109 | # https://docs.djangoproject.com/en/4.2/topics/i18n/ 110 | 111 | LANGUAGE_CODE = 'en-us' 112 | 113 | TIME_ZONE = 'UTC' 114 | 115 | USE_I18N = True 116 | 117 | USE_TZ = True 118 | 119 | 120 | # Static files (CSS, JavaScript, Images) 121 | # https://docs.djangoproject.com/en/4.2/howto/static-files/ 122 | 123 | STATIC_URL = 'static/' 124 | STATIC_DIR = os.path.join(BASE_DIR,'static') 125 | STATICFILES_DIRS = [STATIC_DIR] 126 | # Default primary key field type 127 | # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field 128 | 129 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 130 | -------------------------------------------------------------------------------- /blogpost/Blogpost/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for Blogpost project. 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/4.2/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.urls import include, path 15 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 16 | """ 17 | from django.contrib import admin 18 | from django.urls import path 19 | from Blog import views 20 | 21 | urlpatterns = [ 22 | path('admin/', admin.site.urls), 23 | path('', views.home_page,name="home"), 24 | path('about/', views.about_page,name="about"), 25 | path('blog/', views.blog_page,name="blog"), 26 | path('contact/', views.contact_page,name="contact"), 27 | path('signup/', views.signup_page,name="signup"), 28 | path('signin/', views.signin_page,name="signin"), 29 | path('signout/', views.signout_page,name="signout"), 30 | path('AddPost/', views.addBlog_page,name="addpost"), 31 | path('delete/',views.delete_page, name='delete'), 32 | path('update/',views.update_page, name='update'), 33 | ] 34 | -------------------------------------------------------------------------------- /blogpost/Blogpost/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for Blogpost project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Blogpost.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /blogpost/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Blogpost.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /blogpost/static/assets/css/googlefonts.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Lora'; 4 | font-style: italic; 5 | font-weight: 400; 6 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LLPtLp_A.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Lora'; 12 | font-style: italic; 13 | font-weight: 400; 14 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LJftLp_A.woff2) format('woff2'); 15 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* vietnamese */ 18 | @font-face { 19 | font-family: 'Lora'; 20 | font-style: italic; 21 | font-weight: 400; 22 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LLvtLp_A.woff2) format('woff2'); 23 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 24 | } 25 | /* latin-ext */ 26 | @font-face { 27 | font-family: 'Lora'; 28 | font-style: italic; 29 | font-weight: 400; 30 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LL_tLp_A.woff2) format('woff2'); 31 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 32 | } 33 | /* latin */ 34 | @font-face { 35 | font-family: 'Lora'; 36 | font-style: italic; 37 | font-weight: 400; 38 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LIftL.woff2) format('woff2'); 39 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 40 | } 41 | /* cyrillic-ext */ 42 | @font-face { 43 | font-family: 'Lora'; 44 | font-style: italic; 45 | font-weight: 700; 46 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LLPtLp_A.woff2) format('woff2'); 47 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 48 | } 49 | /* cyrillic */ 50 | @font-face { 51 | font-family: 'Lora'; 52 | font-style: italic; 53 | font-weight: 700; 54 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LJftLp_A.woff2) format('woff2'); 55 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 56 | } 57 | /* vietnamese */ 58 | @font-face { 59 | font-family: 'Lora'; 60 | font-style: italic; 61 | font-weight: 700; 62 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LLvtLp_A.woff2) format('woff2'); 63 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 64 | } 65 | /* latin-ext */ 66 | @font-face { 67 | font-family: 'Lora'; 68 | font-style: italic; 69 | font-weight: 700; 70 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LL_tLp_A.woff2) format('woff2'); 71 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 72 | } 73 | /* latin */ 74 | @font-face { 75 | font-family: 'Lora'; 76 | font-style: italic; 77 | font-weight: 700; 78 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIhMX1D_JOuMw_LIftL.woff2) format('woff2'); 79 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 80 | } 81 | /* cyrillic-ext */ 82 | @font-face { 83 | font-family: 'Lora'; 84 | font-style: normal; 85 | font-weight: 400; 86 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwf7I-NP.woff2) format('woff2'); 87 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 88 | } 89 | /* cyrillic */ 90 | @font-face { 91 | font-family: 'Lora'; 92 | font-style: normal; 93 | font-weight: 400; 94 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMw77I-NP.woff2) format('woff2'); 95 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 96 | } 97 | /* vietnamese */ 98 | @font-face { 99 | font-family: 'Lora'; 100 | font-style: normal; 101 | font-weight: 400; 102 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwX7I-NP.woff2) format('woff2'); 103 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 104 | } 105 | /* latin-ext */ 106 | @font-face { 107 | font-family: 'Lora'; 108 | font-style: normal; 109 | font-weight: 400; 110 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwT7I-NP.woff2) format('woff2'); 111 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 112 | } 113 | /* latin */ 114 | @font-face { 115 | font-family: 'Lora'; 116 | font-style: normal; 117 | font-weight: 400; 118 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwr7Iw.woff2) format('woff2'); 119 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 120 | } 121 | /* cyrillic-ext */ 122 | @font-face { 123 | font-family: 'Lora'; 124 | font-style: normal; 125 | font-weight: 700; 126 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwf7I-NP.woff2) format('woff2'); 127 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 128 | } 129 | /* cyrillic */ 130 | @font-face { 131 | font-family: 'Lora'; 132 | font-style: normal; 133 | font-weight: 700; 134 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMw77I-NP.woff2) format('woff2'); 135 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 136 | } 137 | /* vietnamese */ 138 | @font-face { 139 | font-family: 'Lora'; 140 | font-style: normal; 141 | font-weight: 700; 142 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwX7I-NP.woff2) format('woff2'); 143 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 144 | } 145 | /* latin-ext */ 146 | @font-face { 147 | font-family: 'Lora'; 148 | font-style: normal; 149 | font-weight: 700; 150 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwT7I-NP.woff2) format('woff2'); 151 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 152 | } 153 | /* latin */ 154 | @font-face { 155 | font-family: 'Lora'; 156 | font-style: normal; 157 | font-weight: 700; 158 | src: url(https://fonts.gstatic.com/s/lora/v32/0QIvMX1D_JOuMwr7Iw.woff2) format('woff2'); 159 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 160 | } 161 | 162 | /* cyrillic-ext */ 163 | @font-face { 164 | font-family: 'Open Sans'; 165 | font-style: italic; 166 | font-weight: 300; 167 | font-stretch: 100%; 168 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); 169 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 170 | } 171 | /* cyrillic */ 172 | @font-face { 173 | font-family: 'Open Sans'; 174 | font-style: italic; 175 | font-weight: 300; 176 | font-stretch: 100%; 177 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); 178 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 179 | } 180 | /* greek-ext */ 181 | @font-face { 182 | font-family: 'Open Sans'; 183 | font-style: italic; 184 | font-weight: 300; 185 | font-stretch: 100%; 186 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); 187 | unicode-range: U+1F00-1FFF; 188 | } 189 | /* greek */ 190 | @font-face { 191 | font-family: 'Open Sans'; 192 | font-style: italic; 193 | font-weight: 300; 194 | font-stretch: 100%; 195 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); 196 | unicode-range: U+0370-03FF; 197 | } 198 | /* hebrew */ 199 | @font-face { 200 | font-family: 'Open Sans'; 201 | font-style: italic; 202 | font-weight: 300; 203 | font-stretch: 100%; 204 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); 205 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 206 | } 207 | /* vietnamese */ 208 | @font-face { 209 | font-family: 'Open Sans'; 210 | font-style: italic; 211 | font-weight: 300; 212 | font-stretch: 100%; 213 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); 214 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 215 | } 216 | /* latin-ext */ 217 | @font-face { 218 | font-family: 'Open Sans'; 219 | font-style: italic; 220 | font-weight: 300; 221 | font-stretch: 100%; 222 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); 223 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 224 | } 225 | /* latin */ 226 | @font-face { 227 | font-family: 'Open Sans'; 228 | font-style: italic; 229 | font-weight: 300; 230 | font-stretch: 100%; 231 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); 232 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 233 | } 234 | /* cyrillic-ext */ 235 | @font-face { 236 | font-family: 'Open Sans'; 237 | font-style: italic; 238 | font-weight: 400; 239 | font-stretch: 100%; 240 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); 241 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 242 | } 243 | /* cyrillic */ 244 | @font-face { 245 | font-family: 'Open Sans'; 246 | font-style: italic; 247 | font-weight: 400; 248 | font-stretch: 100%; 249 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); 250 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 251 | } 252 | /* greek-ext */ 253 | @font-face { 254 | font-family: 'Open Sans'; 255 | font-style: italic; 256 | font-weight: 400; 257 | font-stretch: 100%; 258 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); 259 | unicode-range: U+1F00-1FFF; 260 | } 261 | /* greek */ 262 | @font-face { 263 | font-family: 'Open Sans'; 264 | font-style: italic; 265 | font-weight: 400; 266 | font-stretch: 100%; 267 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); 268 | unicode-range: U+0370-03FF; 269 | } 270 | /* hebrew */ 271 | @font-face { 272 | font-family: 'Open Sans'; 273 | font-style: italic; 274 | font-weight: 400; 275 | font-stretch: 100%; 276 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); 277 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 278 | } 279 | /* vietnamese */ 280 | @font-face { 281 | font-family: 'Open Sans'; 282 | font-style: italic; 283 | font-weight: 400; 284 | font-stretch: 100%; 285 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); 286 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 287 | } 288 | /* latin-ext */ 289 | @font-face { 290 | font-family: 'Open Sans'; 291 | font-style: italic; 292 | font-weight: 400; 293 | font-stretch: 100%; 294 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); 295 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 296 | } 297 | /* latin */ 298 | @font-face { 299 | font-family: 'Open Sans'; 300 | font-style: italic; 301 | font-weight: 400; 302 | font-stretch: 100%; 303 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); 304 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 305 | } 306 | /* cyrillic-ext */ 307 | @font-face { 308 | font-family: 'Open Sans'; 309 | font-style: italic; 310 | font-weight: 600; 311 | font-stretch: 100%; 312 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); 313 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 314 | } 315 | /* cyrillic */ 316 | @font-face { 317 | font-family: 'Open Sans'; 318 | font-style: italic; 319 | font-weight: 600; 320 | font-stretch: 100%; 321 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); 322 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 323 | } 324 | /* greek-ext */ 325 | @font-face { 326 | font-family: 'Open Sans'; 327 | font-style: italic; 328 | font-weight: 600; 329 | font-stretch: 100%; 330 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); 331 | unicode-range: U+1F00-1FFF; 332 | } 333 | /* greek */ 334 | @font-face { 335 | font-family: 'Open Sans'; 336 | font-style: italic; 337 | font-weight: 600; 338 | font-stretch: 100%; 339 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); 340 | unicode-range: U+0370-03FF; 341 | } 342 | /* hebrew */ 343 | @font-face { 344 | font-family: 'Open Sans'; 345 | font-style: italic; 346 | font-weight: 600; 347 | font-stretch: 100%; 348 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); 349 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 350 | } 351 | /* vietnamese */ 352 | @font-face { 353 | font-family: 'Open Sans'; 354 | font-style: italic; 355 | font-weight: 600; 356 | font-stretch: 100%; 357 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); 358 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 359 | } 360 | /* latin-ext */ 361 | @font-face { 362 | font-family: 'Open Sans'; 363 | font-style: italic; 364 | font-weight: 600; 365 | font-stretch: 100%; 366 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); 367 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 368 | } 369 | /* latin */ 370 | @font-face { 371 | font-family: 'Open Sans'; 372 | font-style: italic; 373 | font-weight: 600; 374 | font-stretch: 100%; 375 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); 376 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 377 | } 378 | /* cyrillic-ext */ 379 | @font-face { 380 | font-family: 'Open Sans'; 381 | font-style: italic; 382 | font-weight: 700; 383 | font-stretch: 100%; 384 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); 385 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 386 | } 387 | /* cyrillic */ 388 | @font-face { 389 | font-family: 'Open Sans'; 390 | font-style: italic; 391 | font-weight: 700; 392 | font-stretch: 100%; 393 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); 394 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 395 | } 396 | /* greek-ext */ 397 | @font-face { 398 | font-family: 'Open Sans'; 399 | font-style: italic; 400 | font-weight: 700; 401 | font-stretch: 100%; 402 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); 403 | unicode-range: U+1F00-1FFF; 404 | } 405 | /* greek */ 406 | @font-face { 407 | font-family: 'Open Sans'; 408 | font-style: italic; 409 | font-weight: 700; 410 | font-stretch: 100%; 411 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); 412 | unicode-range: U+0370-03FF; 413 | } 414 | /* hebrew */ 415 | @font-face { 416 | font-family: 'Open Sans'; 417 | font-style: italic; 418 | font-weight: 700; 419 | font-stretch: 100%; 420 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); 421 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 422 | } 423 | /* vietnamese */ 424 | @font-face { 425 | font-family: 'Open Sans'; 426 | font-style: italic; 427 | font-weight: 700; 428 | font-stretch: 100%; 429 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); 430 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 431 | } 432 | /* latin-ext */ 433 | @font-face { 434 | font-family: 'Open Sans'; 435 | font-style: italic; 436 | font-weight: 700; 437 | font-stretch: 100%; 438 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); 439 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 440 | } 441 | /* latin */ 442 | @font-face { 443 | font-family: 'Open Sans'; 444 | font-style: italic; 445 | font-weight: 700; 446 | font-stretch: 100%; 447 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); 448 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 449 | } 450 | /* cyrillic-ext */ 451 | @font-face { 452 | font-family: 'Open Sans'; 453 | font-style: italic; 454 | font-weight: 800; 455 | font-stretch: 100%; 456 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); 457 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 458 | } 459 | /* cyrillic */ 460 | @font-face { 461 | font-family: 'Open Sans'; 462 | font-style: italic; 463 | font-weight: 800; 464 | font-stretch: 100%; 465 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); 466 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 467 | } 468 | /* greek-ext */ 469 | @font-face { 470 | font-family: 'Open Sans'; 471 | font-style: italic; 472 | font-weight: 800; 473 | font-stretch: 100%; 474 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); 475 | unicode-range: U+1F00-1FFF; 476 | } 477 | /* greek */ 478 | @font-face { 479 | font-family: 'Open Sans'; 480 | font-style: italic; 481 | font-weight: 800; 482 | font-stretch: 100%; 483 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); 484 | unicode-range: U+0370-03FF; 485 | } 486 | /* hebrew */ 487 | @font-face { 488 | font-family: 'Open Sans'; 489 | font-style: italic; 490 | font-weight: 800; 491 | font-stretch: 100%; 492 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); 493 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 494 | } 495 | /* vietnamese */ 496 | @font-face { 497 | font-family: 'Open Sans'; 498 | font-style: italic; 499 | font-weight: 800; 500 | font-stretch: 100%; 501 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); 502 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 503 | } 504 | /* latin-ext */ 505 | @font-face { 506 | font-family: 'Open Sans'; 507 | font-style: italic; 508 | font-weight: 800; 509 | font-stretch: 100%; 510 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); 511 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 512 | } 513 | /* latin */ 514 | @font-face { 515 | font-family: 'Open Sans'; 516 | font-style: italic; 517 | font-weight: 800; 518 | font-stretch: 100%; 519 | src: url(https://fonts.gstatic.com/s/opensans/v36/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); 520 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 521 | } 522 | /* cyrillic-ext */ 523 | @font-face { 524 | font-family: 'Open Sans'; 525 | font-style: normal; 526 | font-weight: 300; 527 | font-stretch: 100%; 528 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); 529 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 530 | } 531 | /* cyrillic */ 532 | @font-face { 533 | font-family: 'Open Sans'; 534 | font-style: normal; 535 | font-weight: 300; 536 | font-stretch: 100%; 537 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); 538 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 539 | } 540 | /* greek-ext */ 541 | @font-face { 542 | font-family: 'Open Sans'; 543 | font-style: normal; 544 | font-weight: 300; 545 | font-stretch: 100%; 546 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); 547 | unicode-range: U+1F00-1FFF; 548 | } 549 | /* greek */ 550 | @font-face { 551 | font-family: 'Open Sans'; 552 | font-style: normal; 553 | font-weight: 300; 554 | font-stretch: 100%; 555 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); 556 | unicode-range: U+0370-03FF; 557 | } 558 | /* hebrew */ 559 | @font-face { 560 | font-family: 'Open Sans'; 561 | font-style: normal; 562 | font-weight: 300; 563 | font-stretch: 100%; 564 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); 565 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 566 | } 567 | /* vietnamese */ 568 | @font-face { 569 | font-family: 'Open Sans'; 570 | font-style: normal; 571 | font-weight: 300; 572 | font-stretch: 100%; 573 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); 574 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 575 | } 576 | /* latin-ext */ 577 | @font-face { 578 | font-family: 'Open Sans'; 579 | font-style: normal; 580 | font-weight: 300; 581 | font-stretch: 100%; 582 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); 583 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 584 | } 585 | /* latin */ 586 | @font-face { 587 | font-family: 'Open Sans'; 588 | font-style: normal; 589 | font-weight: 300; 590 | font-stretch: 100%; 591 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); 592 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 593 | } 594 | /* cyrillic-ext */ 595 | @font-face { 596 | font-family: 'Open Sans'; 597 | font-style: normal; 598 | font-weight: 400; 599 | font-stretch: 100%; 600 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); 601 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 602 | } 603 | /* cyrillic */ 604 | @font-face { 605 | font-family: 'Open Sans'; 606 | font-style: normal; 607 | font-weight: 400; 608 | font-stretch: 100%; 609 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); 610 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 611 | } 612 | /* greek-ext */ 613 | @font-face { 614 | font-family: 'Open Sans'; 615 | font-style: normal; 616 | font-weight: 400; 617 | font-stretch: 100%; 618 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); 619 | unicode-range: U+1F00-1FFF; 620 | } 621 | /* greek */ 622 | @font-face { 623 | font-family: 'Open Sans'; 624 | font-style: normal; 625 | font-weight: 400; 626 | font-stretch: 100%; 627 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); 628 | unicode-range: U+0370-03FF; 629 | } 630 | /* hebrew */ 631 | @font-face { 632 | font-family: 'Open Sans'; 633 | font-style: normal; 634 | font-weight: 400; 635 | font-stretch: 100%; 636 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); 637 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 638 | } 639 | /* vietnamese */ 640 | @font-face { 641 | font-family: 'Open Sans'; 642 | font-style: normal; 643 | font-weight: 400; 644 | font-stretch: 100%; 645 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); 646 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 647 | } 648 | /* latin-ext */ 649 | @font-face { 650 | font-family: 'Open Sans'; 651 | font-style: normal; 652 | font-weight: 400; 653 | font-stretch: 100%; 654 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); 655 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 656 | } 657 | /* latin */ 658 | @font-face { 659 | font-family: 'Open Sans'; 660 | font-style: normal; 661 | font-weight: 400; 662 | font-stretch: 100%; 663 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); 664 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 665 | } 666 | /* cyrillic-ext */ 667 | @font-face { 668 | font-family: 'Open Sans'; 669 | font-style: normal; 670 | font-weight: 600; 671 | font-stretch: 100%; 672 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); 673 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 674 | } 675 | /* cyrillic */ 676 | @font-face { 677 | font-family: 'Open Sans'; 678 | font-style: normal; 679 | font-weight: 600; 680 | font-stretch: 100%; 681 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); 682 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 683 | } 684 | /* greek-ext */ 685 | @font-face { 686 | font-family: 'Open Sans'; 687 | font-style: normal; 688 | font-weight: 600; 689 | font-stretch: 100%; 690 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); 691 | unicode-range: U+1F00-1FFF; 692 | } 693 | /* greek */ 694 | @font-face { 695 | font-family: 'Open Sans'; 696 | font-style: normal; 697 | font-weight: 600; 698 | font-stretch: 100%; 699 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); 700 | unicode-range: U+0370-03FF; 701 | } 702 | /* hebrew */ 703 | @font-face { 704 | font-family: 'Open Sans'; 705 | font-style: normal; 706 | font-weight: 600; 707 | font-stretch: 100%; 708 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); 709 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 710 | } 711 | /* vietnamese */ 712 | @font-face { 713 | font-family: 'Open Sans'; 714 | font-style: normal; 715 | font-weight: 600; 716 | font-stretch: 100%; 717 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); 718 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 719 | } 720 | /* latin-ext */ 721 | @font-face { 722 | font-family: 'Open Sans'; 723 | font-style: normal; 724 | font-weight: 600; 725 | font-stretch: 100%; 726 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); 727 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 728 | } 729 | /* latin */ 730 | @font-face { 731 | font-family: 'Open Sans'; 732 | font-style: normal; 733 | font-weight: 600; 734 | font-stretch: 100%; 735 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); 736 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 737 | } 738 | /* cyrillic-ext */ 739 | @font-face { 740 | font-family: 'Open Sans'; 741 | font-style: normal; 742 | font-weight: 700; 743 | font-stretch: 100%; 744 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); 745 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 746 | } 747 | /* cyrillic */ 748 | @font-face { 749 | font-family: 'Open Sans'; 750 | font-style: normal; 751 | font-weight: 700; 752 | font-stretch: 100%; 753 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); 754 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 755 | } 756 | /* greek-ext */ 757 | @font-face { 758 | font-family: 'Open Sans'; 759 | font-style: normal; 760 | font-weight: 700; 761 | font-stretch: 100%; 762 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); 763 | unicode-range: U+1F00-1FFF; 764 | } 765 | /* greek */ 766 | @font-face { 767 | font-family: 'Open Sans'; 768 | font-style: normal; 769 | font-weight: 700; 770 | font-stretch: 100%; 771 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); 772 | unicode-range: U+0370-03FF; 773 | } 774 | /* hebrew */ 775 | @font-face { 776 | font-family: 'Open Sans'; 777 | font-style: normal; 778 | font-weight: 700; 779 | font-stretch: 100%; 780 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); 781 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 782 | } 783 | /* vietnamese */ 784 | @font-face { 785 | font-family: 'Open Sans'; 786 | font-style: normal; 787 | font-weight: 700; 788 | font-stretch: 100%; 789 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); 790 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 791 | } 792 | /* latin-ext */ 793 | @font-face { 794 | font-family: 'Open Sans'; 795 | font-style: normal; 796 | font-weight: 700; 797 | font-stretch: 100%; 798 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); 799 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 800 | } 801 | /* latin */ 802 | @font-face { 803 | font-family: 'Open Sans'; 804 | font-style: normal; 805 | font-weight: 700; 806 | font-stretch: 100%; 807 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); 808 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 809 | } 810 | /* cyrillic-ext */ 811 | @font-face { 812 | font-family: 'Open Sans'; 813 | font-style: normal; 814 | font-weight: 800; 815 | font-stretch: 100%; 816 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); 817 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; 818 | } 819 | /* cyrillic */ 820 | @font-face { 821 | font-family: 'Open Sans'; 822 | font-style: normal; 823 | font-weight: 800; 824 | font-stretch: 100%; 825 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); 826 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 827 | } 828 | /* greek-ext */ 829 | @font-face { 830 | font-family: 'Open Sans'; 831 | font-style: normal; 832 | font-weight: 800; 833 | font-stretch: 100%; 834 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); 835 | unicode-range: U+1F00-1FFF; 836 | } 837 | /* greek */ 838 | @font-face { 839 | font-family: 'Open Sans'; 840 | font-style: normal; 841 | font-weight: 800; 842 | font-stretch: 100%; 843 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); 844 | unicode-range: U+0370-03FF; 845 | } 846 | /* hebrew */ 847 | @font-face { 848 | font-family: 'Open Sans'; 849 | font-style: normal; 850 | font-weight: 800; 851 | font-stretch: 100%; 852 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); 853 | unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; 854 | } 855 | /* vietnamese */ 856 | @font-face { 857 | font-family: 'Open Sans'; 858 | font-style: normal; 859 | font-weight: 800; 860 | font-stretch: 100%; 861 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); 862 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; 863 | } 864 | /* latin-ext */ 865 | @font-face { 866 | font-family: 'Open Sans'; 867 | font-style: normal; 868 | font-weight: 800; 869 | font-stretch: 100%; 870 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); 871 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 872 | } 873 | /* latin */ 874 | @font-face { 875 | font-family: 'Open Sans'; 876 | font-style: normal; 877 | font-weight: 800; 878 | font-stretch: 100%; 879 | src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); 880 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 881 | } -------------------------------------------------------------------------------- /blogpost/static/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/favicon.ico -------------------------------------------------------------------------------- /blogpost/static/assets/img/about-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/about-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/contact-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/contact-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/home-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/home-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/login-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/login-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/post-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/post-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/post-sample-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/post-sample-image.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/signup-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/signup-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/img/story-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HashimThePassionate/BlogProject/de324b032ea483ed00ad95f69b579f99dbb86e86/blogpost/static/assets/img/story-bg.jpg -------------------------------------------------------------------------------- /blogpost/static/assets/js/scripts.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - Clean Blog v6.0.9 (https://startbootstrap.com/theme/clean-blog) 3 | * Copyright 2013-2023 Start Bootstrap 4 | * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-clean-blog/blob/master/LICENSE) 5 | */ 6 | window.addEventListener('DOMContentLoaded', () => { 7 | let scrollPos = 0; 8 | const mainNav = document.getElementById('mainNav'); 9 | const headerHeight = mainNav.clientHeight; 10 | window.addEventListener('scroll', function() { 11 | const currentTop = document.body.getBoundingClientRect().top * -1; 12 | if ( currentTop < scrollPos) { 13 | // Scrolling Up 14 | if (currentTop > 0 && mainNav.classList.contains('is-fixed')) { 15 | mainNav.classList.add('is-visible'); 16 | } else { 17 | console.log(123); 18 | mainNav.classList.remove('is-visible', 'is-fixed'); 19 | } 20 | } else { 21 | // Scrolling Down 22 | mainNav.classList.remove(['is-visible']); 23 | if (currentTop > headerHeight && !mainNav.classList.contains('is-fixed')) { 24 | mainNav.classList.add('is-fixed'); 25 | } 26 | } 27 | scrollPos = currentTop; 28 | }); 29 | }) 30 | -------------------------------------------------------------------------------- /blogpost/templates/about.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}About Page{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/about-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}About Me{% endblock heading %} 6 | {% block headspan %}This is what I do.{% endblock headspan %} 7 | {% block section %} 8 |
9 |
10 |
11 |
12 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe nostrum ullam eveniet pariatur voluptates odit, fuga atque ea nobis sit soluta odio, adipisci quas excepturi maxime quae totam ducimus consectetur?

13 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eius praesentium recusandae illo eaque architecto error, repellendus iusto reprehenderit, doloribus, minus sunt. Numquam at quae voluptatum in officia voluptas voluptatibus, minus!

14 |

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aut consequuntur magnam, excepturi aliquid ex itaque esse est vero natus quae optio aperiam soluta voluptatibus corporis atque iste neque sit tempora!

15 |
16 |
17 |
18 |
19 | {% endblock section %} 20 | -------------------------------------------------------------------------------- /blogpost/templates/addBlog.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}Add Blog{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/story-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}Please Add your Blog{% endblock heading %} 6 | {% block section %} 7 |
8 |
9 |
10 |

Want to get in touch? Fill out the form below to send me a message and I will get back to you as soon as possible!

11 |
12 |
13 | {% csrf_token %} 14 |
15 | {{form.title}} 16 | 19 |
20 |
21 |
22 | {{form.des}} 23 |
24 | 25 |
26 |
27 |
28 | 29 |
30 |
31 |
32 |
33 |
34 |
35 | {% endblock section %} 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /blogpost/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% load static %} 4 | 5 | 6 | 7 | 8 | 9 | {% block blogtitle %} {% endblock blogtitle %} 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% include "navbar.html" %} 20 | 21 |
22 |
23 |
24 |
25 |
26 |

{% block heading %}{% endblock heading %}

27 | {% block headspan %}{% endblock headspan %} 28 |
29 |
30 |
31 |
32 |
33 | 34 |
35 | 105 | 106 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /blogpost/templates/contact.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}About Page{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/about-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}About Me{% endblock heading %} 6 | {% block headspan %}This is what I do.{% endblock headspan %} 7 | {% block section %} 8 |
9 |
10 |
11 |

Want to get in touch? Fill out the form below to send me a message and I will get back to you as soon as possible!

12 |
13 |
14 | {% if messages %} 15 | 16 | 17 | 18 | 19 | 20 | {% for message in messages %} 21 | 28 | {% endfor %} 29 | {% endif %} 30 | {% csrf_token %} 31 |
32 | {{form.name}} 33 | 36 |
37 | {{form.error}} 38 |
39 |
40 |
41 | {{form.email}} 42 | 43 |
{{form.error}}
44 |
45 |
46 | {{form.phoneno}} 47 | 48 |
49 |
50 | {{form.message}} 51 | 52 |
53 |
54 |
55 | 56 |
57 |
58 |
59 |
60 |
61 |
62 | {% endblock section %} 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /blogpost/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}Home Page{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/contact-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}Clean Blog{% endblock heading %} 6 | {% block headspan %}A Blog Theme by Start Bootstrap{% endblock headspan %} 7 | {% block sectionhead %}Man must explore, and this is exploration at its greatest{% endblock sectionhead %} 8 | {% block sectionpara %}Problems look mighty small from 150 miles up{% endblock sectionpara %} -------------------------------------------------------------------------------- /blogpost/templates/navbar.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blogpost/templates/post.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}Blog{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/post-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}Man must explore{% endblock heading %} 6 | {% block headspan %}Problems look mighty small from 150 miles{% endblock headspan %} 7 | {% block section %} 8 |
9 | {% if user.is_authenticated %} 10 | Signout 11 | Add Post 12 | {% for b in blog %} 13 |
14 |
15 |

{{b.title}}

16 |

{{b.des}}

17 |
18 | Edit 19 |
20 | {% if perms.Blogpost.delete_Blog %} 21 | 22 | {% endif %} 23 |
24 |
25 | {% endfor %} 26 | {% endif %} 27 |
28 | {% endblock section %} 29 | 30 | -------------------------------------------------------------------------------- /blogpost/templates/signin.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}Signup Page{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/login-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}Register Here{% endblock heading %} 6 | {% block headspan %}This is place to register{% endblock headspan %} 7 | {% block section %} 8 |
9 |
10 |
11 |

Want to get in touch? Fill out the form below to send me a message and I will get back to you as soon as possible!

12 |
13 |
14 | {% if messages %} 15 | 16 | 17 | 18 | 19 | 20 | {% for message in messages %} 21 | 28 | {% endfor %} 29 | {% endif %} 30 | {% csrf_token %} 31 |
32 | {{form.username}} 33 | 36 |
37 | {{form.error}} 38 |
39 |
40 |
41 | {{form.password}} 42 | 43 |
{{form.error}}
44 |
45 |
46 |
47 | 48 |
49 |
50 |
51 |
52 |
53 |
54 | {% endblock section %} 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /blogpost/templates/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% block blogtitle %}Signup Page{% endblock blogtitle %} 4 | {% block img %}background-image: url('{% static "assets/img/signup-bg.jpg" %}'){% endblock img %} 5 | {% block heading %}Register Here{% endblock heading %} 6 | {% block headspan %}This is place to register{% endblock headspan %} 7 | {% block section %} 8 |
9 |
10 |
11 |

Want to get in touch? Fill out the form below to send me a message and I will get back to you as soon as possible!

12 |
13 |
14 | {% if messages %} 15 | 16 | 17 | 18 | 19 | 20 | {% for message in messages %} 21 | 28 | {% endfor %} 29 | {% endif %} 30 | {% csrf_token %} 31 |
32 | {{form.username}} 33 | 36 |
37 | {{form.error}} 38 |
39 |
40 |
41 | {{form.email}} 42 | 43 |
{{form.error}}
44 |
45 |
46 | {{form.first_name}} 47 | 48 |
49 |
50 | {{form.last_name}} 51 | 52 |
53 |
54 | {{form.password1}} 55 | 56 |
57 |
58 | {{form.password2}} 59 | 60 |
61 |
62 |
63 | 64 |
65 |
66 |
67 |
68 |
69 |
70 | {% endblock section %} 71 | 72 | 73 | 74 | 75 | --------------------------------------------------------------------------------