diff --git a/blog/__pycache__/feeds.cpython-311.pyc b/blog/__pycache__/feeds.cpython-311.pyc new file mode 100644 index 0000000..288dc84 Binary files /dev/null and b/blog/__pycache__/feeds.cpython-311.pyc differ diff --git a/blog/__pycache__/forms.cpython-311.pyc b/blog/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000..a8c54b9 Binary files /dev/null and b/blog/__pycache__/forms.cpython-311.pyc differ diff --git a/blog/__pycache__/sitemaps.cpython-311.pyc b/blog/__pycache__/sitemaps.cpython-311.pyc new file mode 100644 index 0000000..a1de354 Binary files /dev/null and b/blog/__pycache__/sitemaps.cpython-311.pyc differ diff --git a/blog/feeds.py b/blog/feeds.py new file mode 100644 index 0000000..7818ca7 --- /dev/null +++ b/blog/feeds.py @@ -0,0 +1,23 @@ +import markdown +from django.contrib.syndication.views import Feed +from django.template.defaultfilters import truncatewords_html +from django.urls import reverse_lazy +from .models import Post + + +class LatestPostFeed(Feed): + title = 'My blog' + link = reverse_lazy('blog:post_list') + description = 'New posts of my blog.' + + def items(self): + return Post.published.all()[:5] + + def item_title(self, item): + return item.title + + def item_description(self, item): + return truncatewords_html(markdown.markdown(item.body), 30) + + def item_pubdate(self, item): + return item.publish diff --git a/blog/forms.py b/blog/forms.py new file mode 100644 index 0000000..1188962 --- /dev/null +++ b/blog/forms.py @@ -0,0 +1,20 @@ +from django import forms +from .models import Comment + + +class EmailPostForm(forms.Form): + name = forms.CharField(max_length=25) + email = forms.EmailField() + to = forms.EmailField() + comments = forms.CharField(required=False, + widget=forms.Textarea) + + +class CommentForm(forms.ModelForm): + class Meta: + model = Comment + fields = ['name', 'email', 'body'] + + +class SearchForm(forms.Form): + query = forms.CharField() diff --git a/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py b/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py new file mode 100644 index 0000000..4e78b7e --- /dev/null +++ b/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py @@ -0,0 +1,34 @@ +# Generated by Django 4.2 on 2023-05-22 16:57 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_alter_post_slug'), + ] + + operations = [ + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=80)), + ('email', models.EmailField(max_length=254)), + ('body', models.TextField()), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('active', models.BooleanField(default=True)), + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='blog.post')), + ], + options={ + 'ordering': ['created'], + }, + ), + migrations.AddIndex( + model_name='comment', + index=models.Index(fields=['created'], name='blog_commen_created_0e6ed4_idx'), + ), + ] diff --git a/blog/migrations/0004_post_tags.py b/blog/migrations/0004_post_tags.py new file mode 100644 index 0000000..ec6ee4f --- /dev/null +++ b/blog/migrations/0004_post_tags.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2 on 2023-05-24 16:42 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0005_auto_20220424_2025'), + ('blog', '0003_comment_comment_blog_commen_created_0e6ed4_idx'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='tags', + field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc b/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc new file mode 100644 index 0000000..81d449b Binary files /dev/null and b/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc differ diff --git a/blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc b/blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc new file mode 100644 index 0000000..2e42fa1 Binary files /dev/null and b/blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc differ diff --git a/blog/sitemaps.py b/blog/sitemaps.py new file mode 100644 index 0000000..c4bb6b5 --- /dev/null +++ b/blog/sitemaps.py @@ -0,0 +1,13 @@ +from django.contrib.sitemaps import Sitemap +from .models import Post + + +class PostSitemap(Sitemap): + changefreq = 'weekly' + priority = 0.9 + + def items(self): + return Post.published.all() + + def lastmod(self, obj): + return obj.updated diff --git a/blog/templates/blog/post/comment.html b/blog/templates/blog/post/comment.html new file mode 100644 index 0000000..29bef16 --- /dev/null +++ b/blog/templates/blog/post/comment.html @@ -0,0 +1,11 @@ +{% extends 'blog/base.html' %} +{% block title %}Add a comment {% endblock title %} + +{% block content %} +{% if comment %} +

Your comment has been added.

+

Back to the post

+{% else %} +{% include 'blog/post/includes/comment_form.html' %} +{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/blog/templates/blog/post/includes/comment_form.html b/blog/templates/blog/post/includes/comment_form.html new file mode 100644 index 0000000..35a105c --- /dev/null +++ b/blog/templates/blog/post/includes/comment_form.html @@ -0,0 +1,6 @@ +

Add a new comment

+
+ {{form.as_p}} + {% csrf_token %} +

+
\ No newline at end of file diff --git a/blog/templates/blog/post/latest_posts.html b/blog/templates/blog/post/latest_posts.html new file mode 100644 index 0000000..3be24f2 --- /dev/null +++ b/blog/templates/blog/post/latest_posts.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/blog/templates/blog/post/search.html b/blog/templates/blog/post/search.html new file mode 100644 index 0000000..db09915 --- /dev/null +++ b/blog/templates/blog/post/search.html @@ -0,0 +1,32 @@ +{% extends "blog/base.html" %} +{% load blog_tags %} + +{% block title %}Search{% endblock %} + +{% block content %} + {% if query %} +

Posts containing "{{ query }}"

+

+ {% with results.count as total_results %} + Found {{ total_results }} result{{ total_results|pluralize }} + {% endwith %} +

+ {% for post in results %} +

+ + {{ post.title }} + +

+ {{ post.body|markdown|truncatewords_html:12 }} + {% empty %} +

There are no results for your query.

+ {% endfor %} +

Search again

+ {% else %} +

Search for posts

+
+ {{ form.as_p }} + +
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/blog/templates/blog/post/share.html b/blog/templates/blog/post/share.html new file mode 100644 index 0000000..186c94e --- /dev/null +++ b/blog/templates/blog/post/share.html @@ -0,0 +1,17 @@ +{% extends 'blog/base.html' %} +{% block title %} Share a post {% endblock title %} +{% block content %} +{% if sent %} +

E-mail successfully sent

+

+ {{post.title}} was successfully sent to {{form.cleaned_data.to}}. +

+{% else %} +

share {{post.title}} by e-mail

+
+ {{form.as_p }} + {% csrf_token %} + +
+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/blog/templatetags/__init__.py b/blog/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/templatetags/__pycache__/__init__.cpython-311.pyc b/blog/templatetags/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..b47c60f Binary files /dev/null and b/blog/templatetags/__pycache__/__init__.cpython-311.pyc differ diff --git a/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc b/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc new file mode 100644 index 0000000..93c391e Binary files /dev/null and b/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc differ diff --git a/blog/templatetags/blog_tags.py b/blog/templatetags/blog_tags.py new file mode 100644 index 0000000..dcf64f1 --- /dev/null +++ b/blog/templatetags/blog_tags.py @@ -0,0 +1,31 @@ +from django import template +from ..models import Post +from django.db.models import Count, Q +from django.utils.safestring import mark_safe +import markdown + +register = template.Library() + + +@register.simple_tag +def total_posts(): + return Post.published.count() + + +@register.inclusion_tag('blog/post/latest_posts.html') +def show_latest_posts(count=5): + latest_posts = Post.published.order_by('-publish')[:count] + return {'latest_posts': latest_posts} + + +@register.simple_tag +def get_most_commented_posts(count=5): + return Post.published.annotate( + total_comments=Count('comments') + + ).order_by('-total_comments')[:count] + + +@register.filter(name='markdown') +def markdown_format(text): + return mark_safe(markdown.markdown(text)) diff --git a/db.sqlite3 b/db.sqlite3 index bb6682b..cc576d7 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/mysite/__pycache__/settings.cpython-311.pyc b/mysite/__pycache__/settings.cpython-311.pyc index 2e351b5..cbbe067 100644 Binary files a/mysite/__pycache__/settings.cpython-311.pyc and b/mysite/__pycache__/settings.cpython-311.pyc differ diff --git a/mysite/__pycache__/urls.cpython-311.pyc b/mysite/__pycache__/urls.cpython-311.pyc index 81aefd9..e1b5bf7 100644 Binary files a/mysite/__pycache__/urls.cpython-311.pyc and b/mysite/__pycache__/urls.cpython-311.pyc differ diff --git a/mysite/settings.py b/mysite/settings.py index fee457b..3f4664b 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -29,7 +29,7 @@ # Application definition - +SITE_ID = 1 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', @@ -38,6 +38,9 @@ 'django.contrib.messages', 'django.contrib.staticfiles', 'blog.apps.BlogConfig', + 'taggit', + 'django.contrib.sites', + 'django.contrib.sitemaps', ] MIDDLEWARE = [ @@ -76,8 +79,10 @@ DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'dbnew', + 'USER': 'postgres', + 'PASSWORD': 'Admin@123', } } @@ -121,7 +126,14 @@ # Default primary key field type # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field -# DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # STATICFILES_DIRS = [ # BASE_DIR / "static", # ] +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + +EMAIL_HOST = 'smtp.gmail.com' +EMAIL_HOST_USER = 'imamitsinghchauhan@gmail.com' +EMAIL_HOST_PASSWORD = 'vbhgqsemhweiuqcx' +EMAIL_PORT = 587 +EMAIL_USE_TLS = True diff --git a/mysite/urls.py b/mysite/urls.py index 4da8ec1..da6fd7e 100644 --- a/mysite/urls.py +++ b/mysite/urls.py @@ -1,8 +1,15 @@ from django.contrib import admin from django.urls import path, include +from django.contrib.sitemaps.views import sitemap +from blog.sitemaps import PostSitemap +sitemaps = { + 'posts': PostSitemap, +} urlpatterns = [ path('admin/', admin.site.urls), - path('blog/', include('blog.urls', namespace='blog')), + path('', include('blog.urls', namespace='blog')), + path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, + name='django.contrib.sitemaps.views.sitemap') ]