44 |
├── .gitignore ├── LICENSE ├── Procfile ├── README.md ├── TwitterDemo.png ├── blog ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20181020_1800.py │ ├── 0003_remove_post_title.py │ ├── 0004_comment.py │ ├── 0005_auto_20181024_0929.py │ ├── 0006_auto_20200422_1239.py │ ├── 0007_auto_20200531_1748.py │ ├── 0008_auto_20200531_1838.py │ ├── 0009_auto_20201002_1537.py │ ├── 0010_auto_20201110_1916.py │ ├── 0011_auto_20201110_1946.py │ ├── 0012_auto_20210731_2053.py │ └── __init__.py ├── models.py ├── serializers.py ├── static │ └── blog │ │ ├── bootstrap.min.css │ │ ├── logo.png │ │ ├── main.css │ │ └── style.css ├── templates │ └── blog │ │ ├── about.html │ │ ├── base.html │ │ ├── follow.html │ │ ├── home.html │ │ ├── post_delete.html │ │ ├── post_detail.html │ │ ├── post_new.html │ │ ├── practise.html │ │ └── user_posts.html ├── tests.py ├── urls.py └── views.py ├── django_project ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── media ├── default.png └── profile_pics │ ├── 01_opt_1.jpg │ ├── 20200907_0639331.jpg │ ├── 42848358.png │ ├── 42848358_ZtK8VUV.png │ ├── Screenshot_from_2020-09-11_19-52-08.png │ ├── default.png │ ├── readydev-logo.png │ └── readydev-logo_KtBM49S.png ├── requirements.txt ├── runtime.txt └── users ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations ├── 0001_initial.py ├── 0002_follow.py ├── 0003_auto_20181020_2105.py ├── 0004_auto_20181020_2110.py ├── 0005_auto_20181024_0929.py ├── 0006_auto_20200308_2220.py ├── 0007_auto_20200422_1239.py ├── 0008_config.py └── __init__.py ├── models.py ├── signals.py ├── templates └── users │ ├── dumpfile.py │ ├── login.html │ ├── logout.html │ ├── password_reset.html │ ├── password_reset_done.html │ ├── profile.html │ ├── register.html │ └── search_result.html ├── tests.py └── views.py /.gitignore: -------------------------------------------------------------------------------- 1 | /env 2 | .vscode 3 | db.sqlite3 4 | __pycache__/ 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Simran Dhiman 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn Django-Twitter-Clone.wsgi --log-file - 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
Thanks for reading 🙏🏽
86 | -------------------------------------------------------------------------------- /TwitterDemo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simran2104/Twirrer__Twitter-Clone-Using-Django/3dcd7925e232b8ad97d2e8ccecb7603e99064360/TwitterDemo.png -------------------------------------------------------------------------------- /blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simran2104/Twirrer__Twitter-Clone-Using-Django/3dcd7925e232b8ad97d2e8ccecb7603e99064360/blog/__init__.py -------------------------------------------------------------------------------- /blog/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from blog.models import Post, Comment, Preference 3 | 4 | 5 | admin.site.register(Post) 6 | admin.site.register(Comment) 7 | admin.site.register(Preference) 8 | -------------------------------------------------------------------------------- /blog/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BlogConfig(AppConfig): 5 | name = 'blog' 6 | -------------------------------------------------------------------------------- /blog/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from .models import Comment 3 | 4 | 5 | class NewCommentForm(forms.ModelForm): 6 | class Meta: 7 | model = Comment 8 | fields = ['content'] 9 | -------------------------------------------------------------------------------- /blog/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.2 on 2018-10-16 21:12 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | import django.utils.timezone 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 15 | ] 16 | 17 | operations = [ 18 | migrations.CreateModel( 19 | name='post', 20 | fields=[ 21 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 22 | ('title', models.CharField(max_length=100)), 23 | ('content', models.TextField()), 24 | ('date_posted', models.DateTimeField(default=django.utils.timezone.now)), 25 | ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 26 | ], 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /blog/migrations/0002_auto_20181020_1800.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.2 on 2018-10-20 18:00 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('blog', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='post', 15 | name='content', 16 | field=models.TextField(max_length=150), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /blog/migrations/0003_remove_post_title.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.2 on 2018-10-20 18:33 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('blog', '0002_auto_20181020_1800'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='post', 15 | name='title', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /blog/migrations/0004_comment.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.2 on 2018-10-24 09:29 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | import django.utils.timezone 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 13 | ('blog', '0003_remove_post_title'), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Comment', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('content', models.TextField(max_length=150)), 22 | ('date_posted', models.DateTimeField(default=django.utils.timezone.now)), 23 | ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 24 | ('post_connected', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post')), 25 | ], 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /blog/migrations/0005_auto_20181024_0929.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.2 on 2018-10-24 09:29 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0004_comment'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /blog/migrations/0006_auto_20200422_1239.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.5 on 2020-04-22 12:39 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0005_auto_20181024_0929'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /blog/migrations/0007_auto_20200531_1748.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.5 on 2020-05-31 17:48 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0006_auto_20200422_1239'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | migrations.AlterField( 20 | model_name='post', 21 | name='content', 22 | field=models.TextField(max_length=1000), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /blog/migrations/0008_auto_20200531_1838.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.5 on 2020-05-31 18:38 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 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('blog', '0007_auto_20200531_1748'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='post', 18 | name='dislikes', 19 | field=models.IntegerField(default=0), 20 | ), 21 | migrations.AddField( 22 | model_name='post', 23 | name='likes', 24 | field=models.IntegerField(default=0), 25 | ), 26 | migrations.AlterField( 27 | model_name='comment', 28 | name='post_connected', 29 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 30 | ), 31 | migrations.CreateModel( 32 | name='Preference', 33 | fields=[ 34 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 35 | ('value', models.IntegerField()), 36 | ('date', models.DateTimeField(auto_now=True)), 37 | ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post')), 38 | ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 39 | ], 40 | options={ 41 | 'unique_together': {('user', 'post', 'value')}, 42 | }, 43 | ), 44 | ] 45 | -------------------------------------------------------------------------------- /blog/migrations/0009_auto_20201002_1537.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.8 on 2020-10-02 10:07 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0008_auto_20200531_1838'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | migrations.AlterField( 20 | model_name='preference', 21 | name='post', 22 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /blog/migrations/0010_auto_20201110_1916.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.8 on 2020-11-10 19:16 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0009_auto_20201002_1537'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | migrations.AlterField( 20 | model_name='preference', 21 | name='post', 22 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /blog/migrations/0011_auto_20201110_1946.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.8 on 2020-11-10 19:46 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0010_auto_20201110_1916'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | migrations.AlterField( 20 | model_name='preference', 21 | name='post', 22 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /blog/migrations/0012_auto_20210731_2053.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.8 on 2021-07-31 15:23 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('blog', '0011_auto_20201110_1946'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='comment', 16 | name='post_connected', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 18 | ), 19 | migrations.AlterField( 20 | model_name='preference', 21 | name='post', 22 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.Post'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /blog/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simran2104/Twirrer__Twitter-Clone-Using-Django/3dcd7925e232b8ad97d2e8ccecb7603e99064360/blog/migrations/__init__.py -------------------------------------------------------------------------------- /blog/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | from django.contrib.auth.models import User 4 | from django.urls import reverse 5 | 6 | 7 | 8 | class Post(models.Model): 9 | content = models.TextField(max_length=1000) 10 | date_posted = models.DateTimeField(default=timezone.now) 11 | author = models.ForeignKey(User, on_delete=models.CASCADE) 12 | likes= models.IntegerField(default=0) 13 | dislikes= models.IntegerField(default=0) 14 | 15 | def __str__(self): 16 | return self.content[:5] 17 | 18 | @property 19 | def number_of_comments(self): 20 | return Comment.objects.filter(post_connected=self).count() 21 | 22 | 23 | class Comment(models.Model): 24 | content = models.TextField(max_length=150) 25 | date_posted = models.DateTimeField(default=timezone.now) 26 | author = models.ForeignKey(User, on_delete=models.CASCADE) 27 | post_connected = models.ForeignKey(Post, on_delete=models.CASCADE) 28 | 29 | 30 | class Preference(models.Model): 31 | user= models.ForeignKey(User, on_delete=models.CASCADE) 32 | post= models.ForeignKey(Post, on_delete=models.CASCADE) 33 | value= models.IntegerField() 34 | date= models.DateTimeField(auto_now= True) 35 | 36 | def __str__(self): 37 | return str(self.user) + ':' + str(self.post) +':' + str(self.value) 38 | 39 | class Meta: 40 | unique_together = ("user", "post", "value") 41 | -------------------------------------------------------------------------------- /blog/serializers.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User, Group 2 | from rest_framework import serializers 3 | from blog.models import Post 4 | 5 | 6 | class UserSerializer(serializers.HyperlinkedModelSerializer): 7 | class Meta: 8 | model = User 9 | fields = ['url', 'username', 'email', 'groups'] 10 | 11 | 12 | class GroupSerializer(serializers.HyperlinkedModelSerializer): 13 | class Meta: 14 | model = Group 15 | fields = ['url', 'name'] 16 | 17 | 18 | class PostSerializer(serializers.ModelSerializer): 19 | class Meta: 20 | model = Post 21 | fields = ['content', 'author'] -------------------------------------------------------------------------------- /blog/static/blog/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simran2104/Twirrer__Twitter-Clone-Using-Django/3dcd7925e232b8ad97d2e8ccecb7603e99064360/blog/static/blog/logo.png -------------------------------------------------------------------------------- /blog/static/blog/main.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --muted-color: rgba(255, 255, 255, 0.5); 3 | } 4 | 5 | 6 | body { 7 | background: #15202b; 8 | color: var(--muted-color); 9 | margin-top: 5rem; 10 | } 11 | 12 | h1, h2, h3, h4, h5, h6 { 13 | color: var(--muted-color); 14 | } 15 | 16 | ul { 17 | margin: 0; 18 | } 19 | 20 | .bg-steel { 21 | background-color: #15202b; 22 | } 23 | 24 | .site-header .navbar-nav .nav-link { 25 | color: var(--muted-color); 26 | } 27 | 28 | .site-header .navbar-nav .nav-link:hover { 29 | color: var(--muted-color); 30 | } 31 | 32 | .site-header .navbar-nav .nav-link.active { 33 | font-weight: 500; 34 | } 35 | 36 | .content-section { 37 | padding: 10px 10px; 38 | margin-bottom: 20px; 39 | } 40 | 41 | .article-metadata { 42 | padding-bottom: 1px; 43 | margin-bottom: 4px; 44 | border-bottom: 1px solid #e3e3e3 45 | } 46 | 47 | .article-metadata a:hover { 48 | color: var(--muted-color); 49 | text-decoration: none; 50 | } 51 | 52 | .article-svg { 53 | width: 25px; 54 | height: 25px; 55 | vertical-align: middle; 56 | } 57 | 58 | .account-img { 59 | height: 125px; 60 | width: 125px; 61 | margin-right: 20px; 62 | margin-bottom: 16px; 63 | } 64 | 65 | .account-heading { 66 | font-size: 2.5rem; 67 | } 68 | 69 | .no-padding { 70 | padding: 0 !important; 71 | } 72 | 73 | a { 74 | color: white; 75 | text-underline: none; 76 | text-decoration: none !important; 77 | } 78 | a:hover { 79 | color: #00FBD7; 80 | text-underline: none !important; 81 | } 82 | .text-muted { 83 | color: var(--muted-color) !important; 84 | } 85 | 86 | article { 87 | border-radius: 4px; 88 | } 89 | 90 | .white-important { 91 | color: white; 92 | font-weight: bold; 93 | } 94 | 95 | .full-width { 96 | width: 100% 97 | } 98 | 99 | .btn-outline-primary { 100 | border-color: white; 101 | color: white !important; 102 | padding: 12px 80px 12px 80px; 103 | font-weight: bold; 104 | background-color: #1da1f2; 105 | border:0; 106 | border-radius: 25px; 107 | } 108 | 109 | .btn:active, .btn-outline-primary:hover { 110 | color: #00FBD7 !important; 111 | background-color: #36405e !important; 112 | border-color: #00FBD7 !important; 113 | } 114 | 115 | .col-form-label { 116 | color: white; 117 | } 118 | 119 | .form-control { 120 | background-color: #36405e !important; 121 | color: var(--muted-color) !important; 122 | box-shadow: 0 0 0 0 !important; 123 | border-radius: 20px !important; 124 | } 125 | 126 | textarea:focus, input:focus { 127 | box-shadow: 0 0 0 0 !important; 128 | border-color: #00FBD7 !important; 129 | color: white !important; 130 | } 131 | 132 | .alert-success { 133 | color: #00FBD7; 134 | background-color: #36405e; 135 | border-color: #00FBD7; 136 | } 137 | 138 | .pointer-cur { 139 | cursor: pointer; 140 | } 141 | 142 | .btn-info { 143 | color: white; 144 | background-color: #36405e; 145 | border-color: white; 146 | } 147 | 148 | .btn-outline-secondary { 149 | border-color: rgba(255, 255, 255, 0.5); 150 | color: white !important; 151 | } 152 | 153 | .btn-outline-secondary:hover { 154 | color: #00FBD7 !important; 155 | background-color: #36405e !important; 156 | border-color: #00FBD7 !important; 157 | } 158 | 159 | .alert-danger { 160 | color: #ff00f0 !important; 161 | background-color: #36405e !important; 162 | border-color: #ff00f0 !important; 163 | } 164 | 165 | .nav-link:hover { 166 | -webkit-transition: color .2s; 167 | color: white !important; 168 | } 169 | 170 | ul { 171 | list-style: none !important; 172 | } 173 | 174 | .hovered-tweet { 175 | background-color: #90909017; 176 | border-radius: 20px; 177 | } 178 | 179 | .hovered-tweet { 180 | border: 1px solid transparent; 181 | } 182 | 183 | .hovered-tweet:hover { 184 | -webkit-transition: background-color ease-in-out .2s; 185 | -webkit-transition: border ease-in-out .2s; 186 | background-color: #2d3741 !important; 187 | border: 1px solid rgba(255, 255, 255, 1); 188 | border-radius: 20px; 189 | } 190 | 191 | .hovered-tweet-comment { 192 | background-color: #2d3741 !important; 193 | padding:15px; 194 | border-radius: 20px; 195 | border:1px solid grey; 196 | } 197 | 198 | .hovered-tweet-comment-in{ 199 | background-color: #2d3741 !important; 200 | padding:12px; 201 | border-radius: 20px; 202 | } 203 | 204 | input[type="file"]::-webkit-file-upload-button { 205 | color: white !important; 206 | background-color: #15202b !important; 207 | border-radius: 4px; 208 | border: 1px solid white; 209 | } 210 | 211 | .follow-click:hover { 212 | color: #00FBD7 !important; 213 | } 214 | 215 | .t-section{ 216 | background-color: #2d3741; 217 | border-radius: 25px; 218 | } 219 | 220 | .who-to-follow{ 221 | border-top: 1px solid grey; 222 | padding: 3px; 223 | margin: 3px; 224 | } 225 | 226 | .profile-section{ 227 | background-color: #2d3741; 228 | padding: 5px; 229 | border-radius: 25px; 230 | } 231 | 232 | 233 | .scrollable { 234 | overflow-y: auto; 235 | border-left: 1px solid #2d3741; 236 | border-right: 1px solid #2d3741; 237 | 238 | } 239 | 240 | .email-profile{ 241 | font-size: 13px; 242 | outline: hidden; 243 | } 244 | 245 | -------------------------------------------------------------------------------- /blog/static/blog/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Arial, Helvetica, sans-serif; 3 | height: 100vh; 4 | margin: 0; 5 | padding: 0; 6 | } 7 | 8 | #map{ 9 | width: 100%; 10 | height: 100%; 11 | } 12 | 13 | .title { 14 | position: absolute; 15 | z-index: 100; 16 | font-size: 70px; 17 | font-weight: bold; 18 | color: white; 19 | text-transform: uppercase; 20 | top: 100px; 21 | left: 100px; 22 | } 23 | 24 | .search-container { 25 | width: 300px; 26 | height: 45px; 27 | background-color: #253341; 28 | border-radius: 30px; 29 | display: flex; 30 | } 31 | 32 | .search-container input { 33 | width: 100%; 34 | font-size: 20px; 35 | background-color: transparent; 36 | border: 0; 37 | color: white; 38 | } 39 | 40 | .search-container .search { 41 | flex-grow: 1; 42 | display: flex; 43 | align-items: center; 44 | padding-left: 20px; 45 | padding-right: 20px; 46 | } 47 | 48 | .search-container input:focus{ 49 | outline: none; 50 | } 51 | 52 | .search i{ 53 | font-size: 25px; 54 | color: white; 55 | } 56 | 57 | .stores-list-container { 58 | width: 400px; 59 | position: absolute; 60 | z-index: 100; 61 | background-color: white; 62 | left: 100px; 63 | top: 320px; 64 | border-radius: 30px; 65 | bottom: 20px; 66 | display: flex; 67 | overflow-y: hidden; 68 | padding-bottom: 30px; 69 | } 70 | 71 | .store-container { 72 | border-bottom: 1px solid #979797; 73 | display:flex; 74 | 75 | } 76 | 77 | .store-container:hover{ 78 | cursor:pointer; 79 | } 80 | 81 | .store-address { 82 | font-size: 21px; 83 | color: #514C4C; 84 | margin-top: 30px; 85 | } 86 | 87 | .store-phone-number{ 88 | color: #B5ADAD; 89 | margin-top: 15px; 90 | margin-bottom: 15px; 91 | } 92 | 93 | .store-address span{ 94 | display: block; 95 | } 96 | 97 | .store-number{ 98 | width: 30px; 99 | height: 30px; 100 | background-color: #454e53; 101 | color: #B5ADAD; 102 | border-radius: 50%; 103 | font-size: 12px; 104 | display: flex; 105 | justify-content: center; 106 | align-items: center; 107 | } 108 | 109 | 110 | .store-info-container{ 111 | flex-grow: 1; 112 | } 113 | 114 | .store-number-container{ 115 | display: flex; 116 | justify-content: center; 117 | align-items: center; 118 | } 119 | 120 | .stores-list{ 121 | flex-grow: 1; 122 | overflow-y: scroll; 123 | padding-right: 20px; 124 | padding-left: 20px; 125 | } 126 | 127 | .fas .fa-location-arrow { 128 | font-size: 18px; 129 | color: #2a9a65; 130 | margin: 2px; 131 | } 132 | 133 | .store-info-window{ 134 | min-width: 300px; 135 | font-size: 18px; 136 | padding: 8px; 137 | } 138 | 139 | .store-info-name{ 140 | font-size: 24px; 141 | font-weight: bold; 142 | color: rgb(0,0,0,87); 143 | } 144 | 145 | .store-info-status{ 146 | margin-top: 6px; 147 | border-bottom: 1px solid #00000029; 148 | padding: 2px; 149 | } 150 | 151 | .store-info-address, .store-info-phone{ 152 | margin: 8px; 153 | } 154 | 155 | .store-info-address , .store-info-phone { 156 | display: flex; 157 | align-items: center; 158 | } 159 | 160 | .store-info-address .circle, .store-info-phone .circle{ 161 | width: 30px; 162 | height: 30px; 163 | background: #1985A1; 164 | color: white; 165 | border-radius: 50%; 166 | display: flex; 167 | align-items: center; 168 | justify-content: center; 169 | margin-right: 8px; 170 | } 171 | 172 | .search i { 173 | cursor: pointer; 174 | } 175 | 176 | .store-container-background{ 177 | display: flex; 178 | flex-grow: 1; 179 | padding-left: 8px; 180 | padding-right: 8px; 181 | margin-bottom: 12px; 182 | margin-top: 12px; 183 | transition: all 0.2s ease-in-out; 184 | } 185 | 186 | .store-container-background:hover{ 187 | background-color: #ccc; 188 | flex-grow: 1; 189 | /* margin: 8px; */ 190 | border-radius: 18px; 191 | 192 | } 193 | 194 | .search-result-profile{ 195 | background-color: #253341; 196 | border-radius: 20px; 197 | padding: 15px; 198 | margin: 9px; 199 | display: flex; 200 | align-items: center; 201 | } -------------------------------------------------------------------------------- /blog/templates/blog/about.html: -------------------------------------------------------------------------------- 1 | {% extends "blog/base.html" %} 2 | {% block content %} 3 |171 | {{ post.content }} 172 |
173 | 174 | 175 |75 | {{ comment.content }} 76 |
77 | 78 | 80 | {{ comment.date_posted | date:"H:i l, d.m.y" }} 81 | 82 | 83 |
39 | {{ post.content }} 40 |
41 | 42 | 44 | {{ post.date_posted | date:"H:i l, d.m.y" }} 45 | 46 | 47 |