├── .DS_Store ├── .gitignore ├── db.sqlite3 ├── djangotweet ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── templates ├── base.html └── registration │ ├── login.html │ └── signup.html └── tweetapp ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations ├── 0001_initial.py ├── 0002_remove_tweet_nickname_tweet_username.py └── __init__.py ├── models.py ├── static └── tweetapp │ └── customform.css ├── templates └── tweetapp │ ├── addtweet.html │ ├── addtweetbyform.html │ ├── addtweetbymodelform.html │ └── listtweet.html ├── tests.py ├── urls.py └── views.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atilsamancioglu/P21-DjangoTweet/f852af143c4cbb2f06b70b655437bf91deac473a/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.egg-info 2 | *.pot 3 | *.py[co] 4 | .tox/ 5 | __pycache__ 6 | MANIFEST 7 | dist/ 8 | docs/_build/ 9 | docs/locale/ 10 | node_modules/ 11 | tests/coverage_html/ 12 | tests/.coverage* 13 | build/ 14 | tests/report/ 15 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atilsamancioglu/P21-DjangoTweet/f852af143c4cbb2f06b70b655437bf91deac473a/db.sqlite3 -------------------------------------------------------------------------------- /djangotweet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atilsamancioglu/P21-DjangoTweet/f852af143c4cbb2f06b70b655437bf91deac473a/djangotweet/__init__.py -------------------------------------------------------------------------------- /djangotweet/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for djangotweet 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.1/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", "djangotweet.settings") 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /djangotweet/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for djangotweet project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.1.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.1/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | 16 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 17 | BASE_DIR = Path(__file__).resolve().parent.parent 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = "django-insecure-ssqjin!cbl#@2=i$zf#g4epirt@yl^de_&fy#p09&5d28angu+" 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = True 28 | 29 | ALLOWED_HOSTS = [] 30 | 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | "tweetapp.apps.TweetappConfig", 36 | "django.contrib.admin", 37 | "django.contrib.auth", 38 | "django.contrib.contenttypes", 39 | "django.contrib.sessions", 40 | "django.contrib.messages", 41 | "django.contrib.staticfiles", 42 | ] 43 | 44 | MIDDLEWARE = [ 45 | "django.middleware.security.SecurityMiddleware", 46 | "django.contrib.sessions.middleware.SessionMiddleware", 47 | "django.middleware.common.CommonMiddleware", 48 | "django.middleware.csrf.CsrfViewMiddleware", 49 | "django.contrib.auth.middleware.AuthenticationMiddleware", 50 | "django.contrib.messages.middleware.MessageMiddleware", 51 | "django.middleware.clickjacking.XFrameOptionsMiddleware", 52 | ] 53 | 54 | ROOT_URLCONF = "djangotweet.urls" 55 | 56 | TEMPLATES = [ 57 | { 58 | "BACKEND": "django.template.backends.django.DjangoTemplates", 59 | "DIRS": [os.path.join(BASE_DIR,'templates')], 60 | "APP_DIRS": True, 61 | "OPTIONS": { 62 | "context_processors": [ 63 | "django.template.context_processors.debug", 64 | "django.template.context_processors.request", 65 | "django.contrib.auth.context_processors.auth", 66 | "django.contrib.messages.context_processors.messages", 67 | ], 68 | }, 69 | }, 70 | ] 71 | 72 | WSGI_APPLICATION = "djangotweet.wsgi.application" 73 | 74 | 75 | # Database 76 | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases 77 | 78 | DATABASES = { 79 | "default": { 80 | "ENGINE": "django.db.backends.sqlite3", 81 | "NAME": BASE_DIR / "db.sqlite3", 82 | } 83 | } 84 | 85 | 86 | # Password validation 87 | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators 88 | 89 | AUTH_PASSWORD_VALIDATORS = [ 90 | { 91 | "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", 92 | }, 93 | {"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",}, 94 | {"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",}, 95 | {"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",}, 96 | ] 97 | 98 | 99 | # Internationalization 100 | # https://docs.djangoproject.com/en/4.1/topics/i18n/ 101 | 102 | LANGUAGE_CODE = "en-us" 103 | 104 | TIME_ZONE = "UTC" 105 | 106 | USE_I18N = True 107 | 108 | USE_TZ = True 109 | 110 | 111 | # Static files (CSS, JavaScript, Images) 112 | # https://docs.djangoproject.com/en/4.1/howto/static-files/ 113 | 114 | STATIC_URL = "static/" 115 | 116 | # Default primary key field type 117 | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field 118 | 119 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" 120 | 121 | LOGIN_REDIRECT_URL = "/" 122 | LOGIN_URL = "" -------------------------------------------------------------------------------- /djangotweet/urls.py: -------------------------------------------------------------------------------- 1 | """djangotweet URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include 18 | 19 | urlpatterns = [ 20 | path("admin/", admin.site.urls), 21 | path("",include('tweetapp.urls')), 22 | path("",include('django.contrib.auth.urls')), 23 | ] 24 | -------------------------------------------------------------------------------- /djangotweet/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for djangotweet 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.1/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", "djangotweet.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /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", "djangotweet.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 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Tweet App 10 | 11 | 12 | 13 | 48 | 49 | {%block content%} 50 | 51 | {%endblock%} 52 | 53 | 54 | -------------------------------------------------------------------------------- /templates/registration/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {%block content%} 4 | {%if user.is_authenticated%} 5 |

Welcome {{user.username}}

6 | 7 | {%else%} 8 | 9 |
10 |
11 | 12 | {% csrf_token %} 13 | 14 | {%for field in form%} 15 |
16 | {{field.label_tag}} 17 | {{field}} 18 |
19 | {%endfor%} 20 | 21 | 22 | 23 | 24 | 25 | {%endif%} 26 | 27 | {%endblock%} -------------------------------------------------------------------------------- /templates/registration/signup.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {%block content%} 4 | 5 |
6 |
7 | 8 | {% csrf_token %} 9 | 10 | {%for field in form%} 11 |
12 | {{field.label_tag}} 13 | {{field}} 14 |
15 | {%endfor%} 16 | 17 | 18 | 19 | 20 | 21 | 22 | {%endblock%} -------------------------------------------------------------------------------- /tweetapp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atilsamancioglu/P21-DjangoTweet/f852af143c4cbb2f06b70b655437bf91deac473a/tweetapp/__init__.py -------------------------------------------------------------------------------- /tweetapp/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from tweetapp.models import Tweet 3 | # Register your models here. 4 | 5 | class TweetAdmin(admin.ModelAdmin): 6 | fieldsets = [ 7 | ('Message Group',{"fields":["message"]}), 8 | ('Nickname Group',{"fields":["nickname"]}) 9 | ] 10 | #fields = ['message','nickname'] 11 | 12 | 13 | admin.site.register(Tweet,TweetAdmin) 14 | -------------------------------------------------------------------------------- /tweetapp/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class TweetappConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "tweetapp" 7 | -------------------------------------------------------------------------------- /tweetapp/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.forms import ModelForm 3 | from tweetapp.models import Tweet 4 | 5 | class AddTweetForm(forms.Form): 6 | nickname_input = forms.CharField(label="Nickname",max_length=50) 7 | message_input = forms.CharField(label="Message",max_length=100, 8 | widget=forms.Textarea(attrs={"class":"tweetmessage"})) 9 | 10 | 11 | class AddTweetModelForm(ModelForm): 12 | class Meta: 13 | model = Tweet 14 | fields = ["username","message"] -------------------------------------------------------------------------------- /tweetapp/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.7 on 2023-04-01 07:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name="Tweet", 15 | fields=[ 16 | ( 17 | "id", 18 | models.BigAutoField( 19 | auto_created=True, 20 | primary_key=True, 21 | serialize=False, 22 | verbose_name="ID", 23 | ), 24 | ), 25 | ("nickname", models.CharField(max_length=50)), 26 | ("message", models.CharField(max_length=100)), 27 | ], 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /tweetapp/migrations/0002_remove_tweet_nickname_tweet_username.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.7 on 2023-04-02 15:07 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 | ("tweetapp", "0001_initial"), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField(model_name="tweet", name="nickname",), 17 | migrations.AddField( 18 | model_name="tweet", 19 | name="username", 20 | field=models.ForeignKey( 21 | null=True, 22 | on_delete=django.db.models.deletion.CASCADE, 23 | to=settings.AUTH_USER_MODEL, 24 | ), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /tweetapp/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atilsamancioglu/P21-DjangoTweet/f852af143c4cbb2f06b70b655437bf91deac473a/tweetapp/migrations/__init__.py -------------------------------------------------------------------------------- /tweetapp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | # Create your models here. 4 | 5 | class Tweet(models.Model): 6 | username = models.ForeignKey(User,on_delete=models.CASCADE, null=True) 7 | message = models.CharField(max_length=100) 8 | 9 | def __str__(self): 10 | return f"Tweet nick: {self.username} message: {self.message}" -------------------------------------------------------------------------------- /tweetapp/static/tweetapp/customform.css: -------------------------------------------------------------------------------- 1 | .tweetform{ 2 | border: 8px solid black; 3 | padding: 10px; 4 | } 5 | 6 | .tweetmessage{ 7 | border: 8px solid orange; 8 | width: 200px; 9 | height: 100px; 10 | padding: 10px; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /tweetapp/templates/tweetapp/addtweet.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {%block content%} 4 |
5 | {% csrf_token %} 6 |
7 | 13 |
14 | 15 | 16 |
17 | 18 |
19 |
20 | {%endblock%} -------------------------------------------------------------------------------- /tweetapp/templates/tweetapp/addtweetbyform.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | 4 | {%block content%} 5 |

AddTweetByForm Page

6 |
7 |
8 | {% csrf_token %} 9 | 10 | {%for field in form%} 11 |
12 | {{field.label_tag}} 13 | {{field}} 14 |
15 | {%endfor%} 16 | 17 | 18 |
19 |
20 | {%endblock%} -------------------------------------------------------------------------------- /tweetapp/templates/tweetapp/addtweetbymodelform.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | 4 | {%block content%} 5 |

AddTweetByModelForm Page

6 |
7 |
8 | {% csrf_token %} 9 | 10 | {%for field in form%} 11 |
12 | {{field.label_tag}} 13 | {{field}} 14 |
15 | {%endfor%} 16 | 17 | 18 |
19 |
20 | {%endblock%} -------------------------------------------------------------------------------- /tweetapp/templates/tweetapp/listtweet.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {%block content%} 4 |
5 | {%for tweet in tweets%} 6 |
7 |
8 |

{{tweet.username}}

9 |
10 |
11 |

{{tweet.message}}

12 |
13 | {%if tweet.username == user%} 14 | Delete 15 | {%endif%} 16 |
17 | {%endfor%} 18 |
19 | {%endblock%} -------------------------------------------------------------------------------- /tweetapp/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /tweetapp/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name = 'tweetapp' 5 | 6 | urlpatterns = [ 7 | path('',views.listtweet,name='listtweet'), #atilsamancioglu.com/tweetapp/ 8 | path('addtweet/',views.addtweet,name='addtweet'),#atilsamancioglu.com/tweetapp/addtweet 9 | path('addtweetbyform',views.addtweetbyform,name='addtweetbyform'), #atilsamancioglu.com/tweetapp/addtweetbyform 10 | path('addtweetbymodelform',views.addtweetbymodelform,name='addtweetbymodelform'), 11 | path('signup/',views.SignUpView.as_view(),name="signup"), 12 | path('deletetweet/',views.deletetweet,name="deletetweet") 13 | ] 14 | -------------------------------------------------------------------------------- /tweetapp/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, redirect 2 | from . import models 3 | from django.urls import reverse, reverse_lazy 4 | from tweetapp.forms import AddTweetForm, AddTweetModelForm 5 | from django.contrib.auth.decorators import login_required 6 | from django.contrib.auth.forms import UserCreationForm 7 | from django.views.generic import CreateView 8 | # Create your views here. 9 | 10 | def listtweet(request): 11 | all_tweets = models.Tweet.objects.all() 12 | tweet_dict = {"tweets":all_tweets} 13 | return render(request,'tweetapp/listtweet.html',context=tweet_dict) 14 | 15 | @login_required(login_url="/login") 16 | def addtweet(request): 17 | if request.POST: 18 | message = request.POST["message"] 19 | models.Tweet.objects.create(username=request.user, message=message) 20 | return redirect(reverse('tweetapp:listtweet')) 21 | else: 22 | return render(request,'tweetapp/addtweet.html') 23 | 24 | 25 | def addtweetbyform(request): 26 | if request.method == "POST": 27 | form = AddTweetForm(request.POST) 28 | if form.is_valid(): 29 | nickname = form.cleaned_data["nickname_input"] 30 | message = form.cleaned_data["message_input"] 31 | models.Tweet.objects.create(nickname=nickname, message = message) 32 | return redirect(reverse('tweetapp:listtweet')) 33 | else: 34 | print("error in form!") 35 | return render(request,'tweetapp/addtweetbyform.html', context={"form":form}) 36 | else: 37 | form = AddTweetForm() 38 | return render(request,'tweetapp/addtweetbyform.html', context={"form":form}) 39 | 40 | def addtweetbymodelform(request): 41 | if request.method == "POST": 42 | form = AddTweetModelForm(request.POST) 43 | if form.is_valid(): 44 | nickname = form.cleaned_data["nickname"] 45 | message = form.cleaned_data["message"] 46 | models.Tweet.objects.create(nickname=nickname, message = message) 47 | return redirect(reverse('tweetapp:listtweet')) 48 | else: 49 | print("error in form!") 50 | return render(request,'tweetapp/addtweetbymodelform.html', context={"form":form}) 51 | else: 52 | form = AddTweetModelForm() 53 | return render(request,'tweetapp/addtweetbymodelform.html', context={"form":form}) 54 | 55 | class SignUpView(CreateView): 56 | form_class = UserCreationForm 57 | success_url = reverse_lazy('login') 58 | template_name = "registration/signup.html" 59 | 60 | 61 | @login_required 62 | def deletetweet(request, id): 63 | tweet = models.Tweet.objects.get(pk=id) 64 | if request.user == tweet.username: 65 | models.Tweet.objects.filter(id=id).delete() 66 | return redirect('tweetapp:listtweet') --------------------------------------------------------------------------------