first commit

This commit is contained in:
Beyhan Oğur
2026-04-26 22:20:45 +03:00
commit d50f14bcb1
681 changed files with 65020 additions and 0 deletions

0
home/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

415
home/admin.py Normal file
View File

@@ -0,0 +1,415 @@
from django.contrib import admin
from django.utils.safestring import mark_safe
from home.models import Tags, Home, AboutMe, MyService, MyServiceTitle, Education, Experience, Skill, Knowledge, \
MyResume, MainMenu
# ==================== TAGS ADMIN ====================
class TagsAdmin(admin.ModelAdmin):
list_display = ('tag', 'is_active', 'created_at', 'updated_at')
list_filter = ('is_active', 'created_at')
search_fields = ('tag',)
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
class Meta:
model = Tags
admin.site.register(Tags, TagsAdmin)
# ==================== HOME ADMIN ====================
class HomeAdmin(admin.ModelAdmin):
list_display = ('name', 'title', 'home_image', 'home_tags', 'is_active', 'slug', 'created_at')
list_filter = ('is_active', 'created_at')
search_fields = ('name', 'title', 'slug', 'keywords')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at', 'slug')
filter_horizontal = ('tags',)
fieldsets = (
('Genel Bilgiler', {
'fields': ('name', 'title', 'slug')
}),
('Butonlar & Video', {
'fields': ('button1', 'button2', 'video')
}),
('SEO & Etiketler', {
'fields': ('keywords', 'tags')
}),
('Görsel', {
'fields': ('image',)
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = Home
def home_tags(self, obj):
tags = obj.tags.all()
if tags:
html = '<ul style="margin: 0; padding-left: 20px;">'
for tag in tags:
html += f'<li>{tag.tag}</li>'
html += '</ul>'
return mark_safe(html)
return mark_safe('<span style="color: #999;">Tag Yok</span>')
home_tags.short_description = 'Etiketler'
def home_image(self, obj):
if obj.image:
return mark_safe(
'<a href="{}" target="_blank"><img src="{}" width="50" height="50" style="object-fit: cover; border-radius: 5px; cursor: pointer;" title="Büyük görseli görmek için tıklayın" /></a>'.format(
obj.image.url, obj.image.url))
return mark_safe('<span style="color: #999;">Resim Yok</span>')
home_image.short_description = 'Görsel'
admin.site.register(Home, HomeAdmin)
# ==================== ABOUT ME ADMIN ====================
class AboutMeAdmin(admin.ModelAdmin):
list_display = ('title', 'about_image', 'city', 'age', 'is_active', 'counter_active', 'created_at')
list_filter = ('is_active', 'counter_active', 'created_at')
search_fields = ('title', 'city', 'website', 'mail')
list_editable = ('is_active', 'counter_active')
readonly_fields = ('created_at', 'updated_at', 'slug')
fieldsets = (
('Genel Bilgiler', {
'fields': ('title', 'slug')
}),
('Görsel', {
'fields': ('image', 'image_sub')
}),
('CV', {
'fields': ('cv',)
}),
('Kişisel Bilgiler', {
'fields': ('birthday', 'age', 'city', 'study', 'degree', 'interests')
}),
('İletişim', {
'fields': ('website', 'phone', 'mail', 'x')
}),
('Sayaçlar', {
'fields': ('done', 'project_done', 'user_h', 'hapy_user', 'great', 'great_reviews', 'team', 'support_team'),
'classes': ('collapse',)
}),
('Ayarlar', {
'fields': ('is_active', 'counter_active')
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = AboutMe
def about_image(self, obj):
if obj.image:
return mark_safe(
'<a href="{}" target="_blank"><img src="{}" width="50" height="50" style="object-fit: cover; border-radius: 5px; cursor: pointer;" title="Büyük görseli görmek için tıklayın" /></a>'.format(
obj.image.url, obj.image.url))
return mark_safe('<span style="color: #999;">Resim Yok</span>')
about_image.short_description = 'Görsel'
admin.site.register(AboutMe, AboutMeAdmin)
# ==================== MY SERVICE ADMIN ====================
class MyServiceAdmin(admin.ModelAdmin):
list_display = ('title', 'service_image', 'is_active', 'slug', 'created_at')
list_filter = ('is_active', 'created_at')
search_fields = ('title', 'slug', 'content')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at', 'slug')
fieldsets = (
('Genel Bilgiler', {
'fields': ('title', 'slug')
}),
('İçerik', {
'fields': ('content',)
}),
('Görsel', {
'fields': ('image',)
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = MyService
def service_image(self, obj):
if obj.image:
return mark_safe(
'<a href="{}" target="_blank"><img src="{}" width="50" height="50" style="object-fit: cover; border-radius: 5px; cursor: pointer;" title="Büyük görseli görmek için tıklayın" /></a>'.format(
obj.image.url, obj.image.url))
return mark_safe('<span style="color: #999;">Resim Yok</span>')
service_image.short_description = 'Görsel'
admin.site.register(MyService, MyServiceAdmin)
# ==================== MY SERVICE TITLE ADMIN ====================
class MyServiceTitleAdmin(admin.ModelAdmin):
list_display = ('title', 'title_sub', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at')
search_fields = ('title', 'title_sub')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Başlık Bilgileri', {
'fields': ('title', 'title_sub')
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = MyServiceTitle
admin.site.register(MyServiceTitle, MyServiceTitleAdmin)
# ==================== MY RESUME ADMIN ====================
class MyResumeAdmin(admin.ModelAdmin):
list_display = ('title', 'title_sub', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at')
search_fields = ('title', 'title_sub')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Genel Bilgiler', {
'fields': ('title', 'title_sub')
}),
('Bölüm Başlıkları', {
'fields': ('education', 'experience', 'coding_skills', 'knowledge')
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = MyResume
admin.site.register(MyResume, MyResumeAdmin)
# ==================== EDUCATION ADMIN ====================
class EducationAdmin(admin.ModelAdmin):
list_display = ('title', 'between_years', 'get_resume', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at', 'resume')
search_fields = ('title', 'content', 'between_years')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Eğitim Bilgileri', {
'fields': ('title', 'between_years', 'content')
}),
('Resume Bağlantısı', {
'fields': ('resume',)
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = Education
def get_resume(self, obj):
if obj.resume:
return obj.resume.title
return mark_safe('<span style="color: #999;">Resume Yok</span>')
get_resume.short_description = 'Resume'
admin.site.register(Education, EducationAdmin)
# ==================== EXPERIENCE ADMIN ====================
class ExperienceAdmin(admin.ModelAdmin):
list_display = ('title', 'between_years', 'get_resume', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at', 'resume')
search_fields = ('title', 'content', 'between_years')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Deneyim Bilgileri', {
'fields': ('title', 'between_years', 'content')
}),
('Resume Bağlantısı', {
'fields': ('resume',)
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = Experience
def get_resume(self, obj):
if obj.resume:
return obj.resume.title
return mark_safe('<span style="color: #999;">Resume Yok</span>')
get_resume.short_description = 'Resume'
admin.site.register(Experience, ExperienceAdmin)
# ==================== SKILL ADMIN ====================
class SkillAdmin(admin.ModelAdmin):
list_display = ('title', 'degree', 'get_resume', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at', 'resume')
search_fields = ('title',)
list_editable = ('is_active', 'degree')
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Yetenek Bilgileri', {
'fields': ('title', 'degree')
}),
('Resume Bağlantısı', {
'fields': ('resume',)
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = Skill
def get_resume(self, obj):
if obj.resume:
return obj.resume.title
return mark_safe('<span style="color: #999;">Resume Yok</span>')
get_resume.short_description = 'Resume'
admin.site.register(Skill, SkillAdmin)
# ==================== KNOWLEDGE ADMIN ====================
class KnowledgeAdmin(admin.ModelAdmin):
list_display = ('title', 'get_resume', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at', 'resume')
search_fields = ('title',)
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Bilgi Başlığı', {
'fields': ('title',)
}),
('Resume Bağlantısı', {
'fields': ('resume',)
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = Knowledge
def get_resume(self, obj):
if obj.resume:
return obj.resume.title
return mark_safe('<span style="color: #999;">Resume Yok</span>')
get_resume.short_description = 'Resume'
admin.site.register(Knowledge, KnowledgeAdmin)
# ==================== MAIN MENU ADMIN ====================
class MainMenuAdmin(admin.ModelAdmin):
list_display = ('home', 'about', 'services', 'resume', 'portfolio', 'contact', 'is_active', 'created_at')
list_filter = ('is_active', 'created_at')
search_fields = ('home', 'about', 'services', 'resume', 'portfolio', 'contact')
list_editable = ('is_active',)
readonly_fields = ('created_at', 'updated_at')
fieldsets = (
('Menü İsimleri', {
'fields': ('home', 'about', 'services', 'resume', 'portfolio', 'contact')
}),
('Ayarlar', {
'fields': ('is_active',)
}),
('Tarihler', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
class Meta:
model = MainMenu
admin.site.register(MainMenu, MainMenuAdmin)

8
home/apps.py Normal file
View File

@@ -0,0 +1,8 @@
from django.apps import AppConfig
class HomeConfig(AppConfig):
name = 'home'
def ready(self):
import home.signals

View File

@@ -0,0 +1,57 @@
# Generated by Django 6.0 on 2026-01-12 17:02
import autoslug.fields
import core.utils
import imagekit.models.fields
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Tags',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('tag', models.CharField(max_length=254, verbose_name='Post Tagları')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=True, verbose_name='Yayındamı')),
],
options={
'verbose_name': 'Post Tagı',
'verbose_name_plural': 'Post Tagları',
'db_table': 'tags',
'ordering': ['-created_at'],
},
),
migrations.CreateModel(
name='Home',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=254, verbose_name='İsim Soyisim ')),
('title', models.CharField(max_length=254, verbose_name='Alt Yazi')),
('button1', models.CharField(max_length=254, verbose_name='Button 1')),
('button2', models.CharField(max_length=254, verbose_name='Button 2')),
('keywords', models.CharField(max_length=254, verbose_name='Seo Kelimeleri Aralarına Virgül Koyunuz')),
('image', imagekit.models.fields.ProcessedImageField(blank=True, null=True, upload_to=core.utils.UniquePathAndRename('uploads/post'))),
('slug', autoslug.fields.AutoSlugField(blank=True, editable=True, max_length=250, populate_from='name', unique=True)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
('tags', models.ManyToManyField(related_name='tags', to='home.tags', verbose_name='Post Tagları')),
],
options={
'verbose_name': 'Home',
'verbose_name_plural': 'Homes',
'db_table': 'homes',
'ordering': ['created_at'],
'unique_together': {('slug',)},
},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0 on 2026-01-12 18:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='home',
name='video',
field=models.URLField(blank=True, default='https://www.youtube.com/watch?v=6zM4p_A0ISk', null=True, verbose_name='Video Url'),
),
]

View File

@@ -0,0 +1,52 @@
# Generated by Django 6.0 on 2026-01-12 20:07
import autoslug.fields
import core.utils
import imagekit.models.fields
import tinymce.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0002_home_video'),
]
operations = [
migrations.CreateModel(
name='AboutMe',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=254, verbose_name='Hakkımda')),
('image', imagekit.models.fields.ProcessedImageField(blank=True, null=True, upload_to=core.utils.UniquePathAndRename('uploads/post'))),
('image_sub', tinymce.models.HTMLField(blank=True, null=True, verbose_name='Resim Altındaki Yazı İçeriği')),
('cv', models.FileField(blank=True, null=True, upload_to='uploads/cv')),
('birthday', models.CharField(blank=True, max_length=254, null=True, verbose_name='Yaş Günü')),
('city', models.CharField(blank=True, max_length=254, null=True, verbose_name='Şehir')),
('study', models.CharField(blank=True, max_length=254, null=True, verbose_name='Okulun')),
('website', models.CharField(blank=True, max_length=254, null=True, verbose_name='Web Sitesi')),
('phone', models.CharField(blank=True, max_length=254, null=True, verbose_name='Telefon')),
('age', models.CharField(blank=True, max_length=5, null=True, verbose_name='Yaş')),
('interests', models.CharField(blank=True, max_length=5, null=True, verbose_name='İlgi alanları')),
('degree', models.CharField(blank=True, max_length=5, null=True, verbose_name='Derecelendirme')),
('x', models.CharField(blank=True, max_length=5, null=True, verbose_name='x')),
('mail', models.CharField(blank=True, max_length=5, null=True, verbose_name='E-Posta')),
('project_done', models.CharField(blank=True, max_length=5, null=True, verbose_name='Tamalangan Projeler')),
('hapy_user', models.CharField(blank=True, max_length=5, null=True, verbose_name='Mutlu Kullanıcı')),
('great_reviews', models.CharField(blank=True, max_length=5, null=True, verbose_name='Yorumlar')),
('support_team', models.CharField(blank=True, max_length=5, null=True, verbose_name='Destek Takımı')),
('slug', autoslug.fields.AutoSlugField(blank=True, editable=True, max_length=250, populate_from='name', unique=True)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'About',
'verbose_name_plural': 'About Me',
'db_table': 'about',
'ordering': ['created_at'],
'unique_together': {('slug',)},
},
),
]

View File

@@ -0,0 +1,53 @@
# Generated by Django 6.0 on 2026-01-12 20:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0003_aboutme'),
]
operations = [
migrations.AlterField(
model_name='aboutme',
name='degree',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='Derecelendirme'),
),
migrations.AlterField(
model_name='aboutme',
name='great_reviews',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='Yorumlar'),
),
migrations.AlterField(
model_name='aboutme',
name='hapy_user',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='Mutlu Kullanıcı'),
),
migrations.AlterField(
model_name='aboutme',
name='interests',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='İlgi alanları'),
),
migrations.AlterField(
model_name='aboutme',
name='mail',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='E-Posta'),
),
migrations.AlterField(
model_name='aboutme',
name='project_done',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='Tamalangan Projeler'),
),
migrations.AlterField(
model_name='aboutme',
name='support_team',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='Destek Takımı'),
),
migrations.AlterField(
model_name='aboutme',
name='x',
field=models.CharField(blank=True, max_length=254, null=True, verbose_name='x'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 6.0 on 2026-01-13 10:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0004_alter_aboutme_degree_alter_aboutme_great_reviews_and_more'),
]
operations = [
migrations.AddField(
model_name='aboutme',
name='done',
field=models.IntegerField(blank=True, null=True, verbose_name='Tamamlanan Projeler'),
),
migrations.AddField(
model_name='aboutme',
name='great',
field=models.IntegerField(blank=True, null=True, verbose_name='Yorum Sayısı'),
),
migrations.AddField(
model_name='aboutme',
name='team',
field=models.IntegerField(blank=True, null=True, verbose_name='Destek Takımı Sayısı'),
),
migrations.AddField(
model_name='aboutme',
name='user_h',
field=models.IntegerField(blank=True, null=True, verbose_name='Mutlu Kullanıcı Sayısı'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0 on 2026-01-13 11:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0005_aboutme_done_aboutme_great_aboutme_team_and_more'),
]
operations = [
migrations.AddField(
model_name='aboutme',
name='counter_active',
field=models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 6.0 on 2026-01-13 11:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0006_aboutme_counter_active'),
]
operations = [
migrations.AlterField(
model_name='aboutme',
name='counter_active',
field=models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Sayaç Yayındamı ?'),
),
migrations.AlterField(
model_name='aboutme',
name='is_active',
field=models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Hakkımda Yayındamı ?'),
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 6.0 on 2026-01-13 11:32
import autoslug.fields
import core.utils
import imagekit.models.fields
import tinymce.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0007_alter_aboutme_counter_active_alter_aboutme_is_active'),
]
operations = [
migrations.CreateModel(
name='MyService',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=254, verbose_name='İsim Soyisim ')),
('content', tinymce.models.HTMLField(blank=True, null=True, verbose_name='İçerik')),
('image', imagekit.models.fields.ProcessedImageField(blank=True, null=True, upload_to=core.utils.UniquePathAndRename('uploads/post'))),
('slug', autoslug.fields.AutoSlugField(blank=True, editable=True, max_length=250, populate_from='name', unique=True)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'Servis',
'verbose_name_plural': 'Servislerim',
'db_table': 'services',
'ordering': ['created_at'],
'unique_together': {('slug',)},
},
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 6.0 on 2026-01-13 11:33
import core.utils
import imagekit.models.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0008_myservice'),
]
operations = [
migrations.AlterField(
model_name='myservice',
name='image',
field=imagekit.models.fields.ProcessedImageField(blank=True, null=True, upload_to=core.utils.UniquePathAndRename('uploads/services')),
),
migrations.AlterField(
model_name='myservice',
name='title',
field=models.CharField(max_length=254, verbose_name='Servis Başlığı '),
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 6.0 on 2026-01-13 12:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0009_alter_myservice_image_alter_myservice_title'),
]
operations = [
migrations.CreateModel(
name='MyServiceTitle',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=254, verbose_name='Servis Başlığı ')),
('title_sub', models.CharField(max_length=254, verbose_name='Servis Başlığı ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'Servis Başlığı',
'verbose_name_plural': 'Servislerim Başlıkları',
'db_table': 'services_title',
'ordering': ['created_at'],
},
),
]

View File

@@ -0,0 +1,104 @@
# Generated by Django 6.0 on 2026-01-13 13:27
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0010_myservicetitle'),
]
operations = [
migrations.CreateModel(
name='Education',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('between_years', models.CharField(max_length=50, verbose_name='Servis Başlığı ')),
('title', models.CharField(max_length=100, verbose_name='Servis Başlığı ')),
('content', models.CharField(max_length=150, verbose_name='Servis Başlığı ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'Education Başlığı',
'verbose_name_plural': 'Education Başlıkları',
'db_table': 'educations',
'ordering': ['created_at'],
},
),
migrations.CreateModel(
name='Experience',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('between_years', models.CharField(max_length=50, verbose_name='Servis Başlığı ')),
('title', models.CharField(max_length=100, verbose_name='Servis Başlığı ')),
('content', models.CharField(max_length=150, verbose_name='Servis Başlığı ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'Experience Başlığı',
'verbose_name_plural': 'Experience Başlıkları',
'db_table': 'experience',
'ordering': ['created_at'],
},
),
migrations.CreateModel(
name='Knowledge',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='Servis Başlığı ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'Knowledge Başlığı',
'verbose_name_plural': 'Knowledge Başlıkları',
'db_table': 'knowledges',
'ordering': ['created_at'],
},
),
migrations.CreateModel(
name='Skill',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='Servis Başlığı ')),
('degree', models.IntegerField(verbose_name='Derecelendirme ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'Skill Başlığı',
'verbose_name_plural': 'Skill Başlıkları',
'db_table': 'skills',
'ordering': ['created_at'],
},
),
migrations.CreateModel(
name='MyResume',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=254, verbose_name='Servis Başlığı ')),
('title_sub', models.CharField(max_length=254, verbose_name='Servis Başlığı ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
('education', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.education')),
('experience', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.experience')),
('knowledge', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.knowledge')),
('skill', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.skill')),
],
options={
'verbose_name': 'MyResume Başlığı',
'verbose_name_plural': 'MyResume Başlıkları',
'db_table': 'resumes',
'ordering': ['created_at'],
},
),
]

View File

@@ -0,0 +1,63 @@
# Generated by Django 6.0 on 2026-01-13 13:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0011_education_experience_knowledge_skill_myresume'),
]
operations = [
migrations.AlterField(
model_name='education',
name='between_years',
field=models.CharField(max_length=50, verbose_name='Yıllar Arasında '),
),
migrations.AlterField(
model_name='education',
name='content',
field=models.CharField(max_length=150, verbose_name='İçerik'),
),
migrations.AlterField(
model_name='education',
name='title',
field=models.CharField(max_length=100, verbose_name='Başlık '),
),
migrations.AlterField(
model_name='experience',
name='between_years',
field=models.CharField(max_length=50, verbose_name='Yıllar Arasında '),
),
migrations.AlterField(
model_name='experience',
name='content',
field=models.CharField(max_length=150, verbose_name='İçerik'),
),
migrations.AlterField(
model_name='experience',
name='title',
field=models.CharField(max_length=100, verbose_name='Başlık '),
),
migrations.AlterField(
model_name='knowledge',
name='title',
field=models.CharField(max_length=100, verbose_name='Başlık '),
),
migrations.AlterField(
model_name='myresume',
name='title',
field=models.CharField(max_length=254, verbose_name='Başlık '),
),
migrations.AlterField(
model_name='myresume',
name='title_sub',
field=models.CharField(max_length=254, verbose_name='Alt Başlığı '),
),
migrations.AlterField(
model_name='skill',
name='title',
field=models.CharField(max_length=100, verbose_name='Başlık'),
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 6.0 on 2026-01-13 13:36
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('home', '0012_alter_education_between_years_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='experience',
options={'ordering': ['created_at'], 'verbose_name': 'Experience ', 'verbose_name_plural': 'Experience '},
),
migrations.AlterModelOptions(
name='knowledge',
options={'ordering': ['created_at'], 'verbose_name': 'Knowledge', 'verbose_name_plural': 'Knowledge'},
),
migrations.AlterModelOptions(
name='myresume',
options={'ordering': ['created_at'], 'verbose_name': 'MyResume', 'verbose_name_plural': 'MyResume'},
),
migrations.AlterModelOptions(
name='skill',
options={'ordering': ['created_at'], 'verbose_name': 'Skill', 'verbose_name_plural': 'Skill'},
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 6.0 on 2026-01-13 13:36
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('home', '0013_alter_experience_options_alter_knowledge_options_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='education',
options={'ordering': ['created_at'], 'verbose_name': 'Education ', 'verbose_name_plural': 'Education'},
),
]

View File

@@ -0,0 +1,50 @@
# Generated by Django 6.0 on 2026-01-13 13:42
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0014_alter_education_options'),
]
operations = [
migrations.RemoveField(
model_name='myresume',
name='education',
),
migrations.RemoveField(
model_name='myresume',
name='experience',
),
migrations.RemoveField(
model_name='myresume',
name='knowledge',
),
migrations.RemoveField(
model_name='myresume',
name='skill',
),
migrations.AddField(
model_name='education',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.myresume'),
),
migrations.AddField(
model_name='experience',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.myresume'),
),
migrations.AddField(
model_name='knowledge',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.myresume'),
),
migrations.AddField(
model_name='skill',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='home.myresume'),
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 6.0 on 2026-01-13 13:46
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0015_remove_myresume_education_remove_myresume_experience_and_more'),
]
operations = [
migrations.AlterField(
model_name='education',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='edu_resume', to='home.myresume'),
),
migrations.AlterField(
model_name='experience',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='exp_resume', to='home.myresume'),
),
migrations.AlterField(
model_name='knowledge',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='know_resume', to='home.myresume'),
),
migrations.AlterField(
model_name='skill',
name='resume',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='skill_resume', to='home.myresume'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 6.0 on 2026-01-13 14:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0016_alter_education_resume_alter_experience_resume_and_more'),
]
operations = [
migrations.AddField(
model_name='knowledge',
name='coding_skills',
field=models.CharField(blank=True, default='Coding Skills', max_length=100, null=True, verbose_name='Coding Skills '),
),
migrations.AddField(
model_name='knowledge',
name='education',
field=models.CharField(blank=True, default='Education', max_length=100, null=True, verbose_name='Education'),
),
migrations.AddField(
model_name='knowledge',
name='experience',
field=models.CharField(blank=True, default='Experience', max_length=100, null=True, verbose_name='Experience '),
),
migrations.AddField(
model_name='knowledge',
name='knowledge',
field=models.CharField(blank=True, default='Knowledge', max_length=100, null=True, verbose_name='Knowledge '),
),
]

View File

@@ -0,0 +1,49 @@
# Generated by Django 6.0 on 2026-01-13 14:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0017_knowledge_coding_skills_knowledge_education_and_more'),
]
operations = [
migrations.RemoveField(
model_name='knowledge',
name='coding_skills',
),
migrations.RemoveField(
model_name='knowledge',
name='education',
),
migrations.RemoveField(
model_name='knowledge',
name='experience',
),
migrations.RemoveField(
model_name='knowledge',
name='knowledge',
),
migrations.AddField(
model_name='myresume',
name='coding_skills',
field=models.CharField(blank=True, default='Coding Skills', max_length=100, null=True, verbose_name='Coding Skills '),
),
migrations.AddField(
model_name='myresume',
name='education',
field=models.CharField(blank=True, default='Education', max_length=100, null=True, verbose_name='Education'),
),
migrations.AddField(
model_name='myresume',
name='experience',
field=models.CharField(blank=True, default='Experience', max_length=100, null=True, verbose_name='Experience '),
),
migrations.AddField(
model_name='myresume',
name='knowledge',
field=models.CharField(blank=True, default='Knowledge', max_length=100, null=True, verbose_name='Knowledge '),
),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 6.0 on 2026-01-16 10:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0018_remove_knowledge_coding_skills_and_more'),
]
operations = [
migrations.CreateModel(
name='MainMenu',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('home', models.CharField(max_length=100, verbose_name='Home ')),
('about', models.CharField(max_length=100, verbose_name='About ')),
('services', models.CharField(max_length=100, verbose_name='Services ')),
('resume', models.CharField(max_length=100, verbose_name='Resume ')),
('portfolio', models.CharField(max_length=100, verbose_name='Portfolio ')),
('contact', models.CharField(max_length=100, verbose_name='Contact ')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Oluşturulma Tarihi')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Güncelleme Tarihi')),
('is_active', models.BooleanField(choices=[(True, 'Evet'), (False, 'Hayır')], default=False, verbose_name='Yayındamı ?')),
],
options={
'verbose_name': 'MainMenu',
'verbose_name_plural': 'MainMenu',
'db_table': 'mane_menu',
'ordering': ['created_at'],
},
),
]

View File

Binary file not shown.

340
home/models.py Normal file
View File

@@ -0,0 +1,340 @@
from autoslug import AutoSlugField
from django.db import models
from imagekit.models import ProcessedImageField
from tinymce.models import HTMLField
from core.utils import image_optimizer
# Create your models here.
class Tags(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
tag = models.CharField(max_length=254, verbose_name="Post Tagları")
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı', choices=aktif)
class Meta:
ordering = ["-created_at"]
db_table = 'tags'
verbose_name_plural = "Post Tagları"
verbose_name = "Post Tagı"
def __str__(self):
return self.tag
class Home(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
name = models.CharField(max_length=254, verbose_name="İsim Soyisim ")
title = models.CharField(max_length=254, verbose_name="Alt Yazi")
button1 = models.CharField(max_length=254, verbose_name="Button 1")
button2 = models.CharField(max_length=254, verbose_name="Button 2")
video = models.URLField(verbose_name="Video Url", null=True, blank=True,
default='https://www.youtube.com/watch?v=6zM4p_A0ISk')
keywords = models.CharField(max_length=254, verbose_name="Seo Kelimeleri Aralarına Virgül Koyunuz")
tags = models.ManyToManyField(Tags, verbose_name="Post Tagları", related_name='tags')
image = ProcessedImageField(**image_optimizer('uploads/post', 400, 400, 90, 'avif'), null=True, blank=True)
slug = AutoSlugField(populate_from='name', null=False, unique=True, editable=True, db_index=True, max_length=250,
blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'homes'
verbose_name_plural = "Homes"
verbose_name = "Home"
unique_together = ('slug',)
def get_slug(self):
slug = self.name.replace('ı', "i").replace('İ', 'i')
number = 1
while Home.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
super().save(*args, **kwargs)
def __str__(self):
return f"Homes: {self.name}"
class AboutMe(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=254, verbose_name="Hakkımda")
image = ProcessedImageField(**image_optimizer('uploads/post', 400, 400, 90, 'avif'), null=True, blank=True)
image_sub = HTMLField(blank=True, null=True, verbose_name='Resim Altındaki Yazı İçeriği')
cv = models.FileField(upload_to='uploads/cv', null=True, blank=True)
birthday = models.CharField(max_length=254, verbose_name="Yaş Günü", null=True, blank=True)
city = models.CharField(max_length=254, verbose_name="Şehir", null=True, blank=True)
study = models.CharField(max_length=254, verbose_name="Okulun", null=True, blank=True)
website = models.CharField(max_length=254, verbose_name="Web Sitesi", null=True, blank=True)
phone = models.CharField(max_length=254, verbose_name="Telefon", null=True, blank=True)
age = models.CharField(max_length=5, verbose_name="Yaş", null=True, blank=True)
interests = models.CharField(max_length=254, verbose_name="İlgi alanları", null=True, blank=True)
degree = models.CharField(max_length=254, verbose_name="Derecelendirme", null=True, blank=True)
x = models.CharField(max_length=254, verbose_name="x", null=True, blank=True)
mail = models.CharField(max_length=254, verbose_name="E-Posta", null=True, blank=True)
done = models.IntegerField(verbose_name="Tamamlanan Projeler", null=True, blank=True)
project_done = models.CharField(max_length=254, verbose_name="Tamalangan Projeler", null=True, blank=True)
user_h = models.IntegerField(verbose_name="Mutlu Kullanıcı Sayısı", null=True, blank=True)
hapy_user = models.CharField(max_length=254, verbose_name="Mutlu Kullanıcı", null=True, blank=True)
great = models.IntegerField(verbose_name="Yorum Sayısı", null=True, blank=True)
great_reviews = models.CharField(max_length=254, verbose_name="Yorumlar", null=True, blank=True)
team = models.IntegerField(verbose_name="Destek Takımı Sayısı", null=True, blank=True)
support_team = models.CharField(max_length=254, verbose_name="Destek Takımı", null=True, blank=True)
slug = AutoSlugField(populate_from='name', null=False, unique=True, editable=True, db_index=True, max_length=250,
blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Hakkımda Yayındamı ?', choices=aktif)
counter_active = models.BooleanField(default=False, verbose_name='Sayaç Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'about'
verbose_name_plural = "About Me"
verbose_name = "About"
unique_together = ('slug',)
def get_slug(self):
slug = self.title.replace('ı', "i").replace('İ', 'i')
number = 1
while AboutMe.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
super().save(*args, **kwargs)
def __str__(self):
return f"About Me: {self.title}"
class MyService(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=254, verbose_name="Servis Başlığı ")
content = HTMLField(blank=True, null=True, verbose_name='İçerik')
image = ProcessedImageField(**image_optimizer('uploads/services', 256, 256, 90, 'png'), null=True, blank=True)
slug = AutoSlugField(populate_from='name', null=False, unique=True, editable=True, db_index=True, max_length=250,
blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'services'
verbose_name_plural = "Servislerim"
verbose_name = "Servis"
unique_together = ('slug',)
def get_slug(self):
slug = self.title.replace('ı', "i").replace('İ', 'i')
number = 1
while Home.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
super().save(*args, **kwargs)
def __str__(self):
return f"Services: {self.title}"
class MyServiceTitle(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=254, verbose_name="Servis Başlığı ")
title_sub = models.CharField(max_length=254, verbose_name="Servis Başlığı ")
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'services_title'
verbose_name_plural = "Servislerim Başlıkları"
verbose_name = "Servis Başlığı"
def __str__(self):
return f"Services: {self.title}"
class MyResume(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=254, verbose_name="Başlık ")
title_sub = models.CharField(max_length=254, verbose_name="Alt Başlığı ")
education = models.CharField(max_length=100, verbose_name="Education", blank=True, null=True, default='Education')
experience = models.CharField(max_length=100, verbose_name="Experience ", blank=True, null=True,
default='Experience')
coding_skills = models.CharField(max_length=100, verbose_name="Coding Skills ", blank=True, null=True,
default='Coding Skills')
knowledge = models.CharField(max_length=100, verbose_name="Knowledge ", blank=True, null=True, default='Knowledge')
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'resumes'
verbose_name_plural = "MyResume"
verbose_name = "MyResume"
def __str__(self):
return f"MyResume: {self.title}"
class Education(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
between_years = models.CharField(max_length=50, verbose_name="Yıllar Arasında ")
title = models.CharField(max_length=100, verbose_name="Başlık ")
content = models.CharField(max_length=150, verbose_name="İçerik")
resume = models.ForeignKey(MyResume, on_delete=models.CASCADE, null=True, blank=True, related_name='edu_resume')
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'educations'
verbose_name_plural = "Education"
verbose_name = "Education "
def __str__(self):
return f"Education: {self.title}"
class Experience(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
between_years = models.CharField(max_length=50, verbose_name="Yıllar Arasında ")
title = models.CharField(max_length=100, verbose_name="Başlık ")
content = models.CharField(max_length=150, verbose_name="İçerik")
resume = models.ForeignKey(MyResume, on_delete=models.CASCADE, null=True, blank=True, related_name='exp_resume')
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'experience'
verbose_name_plural = "Experience "
verbose_name = "Experience "
def __str__(self):
return f"Experience: {self.title}"
class Skill(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=100, verbose_name="Başlık")
degree = models.IntegerField(verbose_name="Derecelendirme ")
resume = models.ForeignKey(MyResume, on_delete=models.CASCADE, null=True, blank=True, related_name='skill_resume')
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'skills'
verbose_name_plural = "Skill"
verbose_name = "Skill"
def __str__(self):
return f"Skill: {self.title}"
class Knowledge(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=100, verbose_name="Başlık ")
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
resume = models.ForeignKey(MyResume, on_delete=models.CASCADE, null=True, blank=True, related_name='know_resume')
class Meta:
ordering = ["created_at"]
db_table = 'knowledges'
verbose_name_plural = "Knowledge"
verbose_name = "Knowledge"
def __str__(self):
return f"Knowledge: {self.title}"
class MainMenu(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
home = models.CharField(max_length=100, verbose_name="Home ")
about = models.CharField(max_length=100, verbose_name="About ")
services = models.CharField(max_length=100, verbose_name="Services ")
resume = models.CharField(max_length=100, verbose_name="Resume ")
portfolio = models.CharField(max_length=100, verbose_name="Portfolio ")
contact = models.CharField(max_length=100, verbose_name="Contact ")
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=False, verbose_name='Yayındamı ?', choices=aktif)
class Meta:
ordering = ["created_at"]
db_table = 'mane_menu'
verbose_name_plural = "MainMenu"
verbose_name = "MainMenu"
def __str__(self):
return f"MainMenu: {self.home}"
"""
education = models.ForeignKey(Education, on_delete=models.CASCADE, null=True, blank=True)
experience = models.ForeignKey(Experience, on_delete=models.CASCADE, null=True, blank=True)
knowledge = models.ForeignKey(Knowledge, on_delete=models.CASCADE, null=True, blank=True)
skill = models.ForeignKey(Skill, on_delete=models.CASCADE, null=True, blank=True)
"""

114
home/serializers.py Normal file
View File

@@ -0,0 +1,114 @@
from rest_framework import serializers
from django.conf import settings
from home.models import Home, Tags, AboutMe, MyService, MyServiceTitle, MyResume, Education, Experience, Skill, \
Knowledge, MainMenu
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tags
fields = ['tag', ]
class HomeSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
tags = TagSerializer(read_only=True, many=True)
class Meta:
model = Home
fields = ['name', 'title', 'button1', 'button2', 'keywords', 'tags', 'image', 'slug', 'created_at', 'video',
'updated_at', 'is_active']
def get_image(self, obj):
if obj.image:
# Sadece path döndür, domain olmadan
return obj.image.url
return None
class AboutMeSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
class Meta:
model = AboutMe
fields = ['title', 'image', 'image_sub', 'cv', 'birthday', 'city', 'study', 'website', 'phone',
'age', 'interests', 'degree', 'x', 'mail', 'project_done', 'hapy_user', 'great_reviews', 'done',
'user_h', 'great', 'team', 'support_team', 'slug', 'created_at', 'updated_at', 'is_active',
'counter_active']
def get_image(self, obj):
if obj.image:
# Sadece path döndür, domain olmadan
return obj.image.url
return None
class MyServiceSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
class Meta:
model = MyService
fields = ['title', 'image', 'content', 'slug', 'created_at', 'updated_at', 'is_active']
def get_image(self, obj):
if obj.image:
# Sadece path döndür, domain olmadan
return obj.image.url
return None
class MyServiceTitleSerializer(serializers.ModelSerializer):
class Meta:
model = MyServiceTitle
fields = ['title', 'title_sub', 'created_at', 'updated_at', 'is_active']
class MainMenuSerializer(serializers.ModelSerializer):
class Meta:
model = MainMenu
fields = '__all__'
class EducationSerializer(serializers.ModelSerializer):
class Meta:
model = Education
fields = ['id', 'between_years', 'title', 'content', 'resume', 'created_at', 'updated_at', 'is_active']
class ExperienceSerializer(serializers.ModelSerializer):
class Meta:
model = Experience
fields = ['id', 'between_years', 'title', 'content', 'resume', 'created_at', 'updated_at', 'is_active']
class SkillSerializer(serializers.ModelSerializer):
class Meta:
model = Skill
fields = ['id', 'title', 'degree', 'resume', 'created_at', 'updated_at', 'is_active']
class KnowledgeSerializer(serializers.ModelSerializer):
class Meta:
model = Knowledge
fields = ['id', 'title', 'resume', 'created_at', 'updated_at', 'is_active']
class MyResumeSerializer(serializers.ModelSerializer):
edu_resume = EducationSerializer(many=True, read_only=True)
exp_resume = ExperienceSerializer(many=True, read_only=True)
skill_resume = SkillSerializer(many=True, read_only=True)
know_resume = KnowledgeSerializer(many=True, read_only=True)
class Meta:
model = MyResume
fields = ['id', 'title', 'title_sub', 'edu_resume', 'exp_resume', 'skill_resume', 'know_resume', 'created_at',
'updated_at', 'is_active', 'education', 'experience', 'coding_skills', 'knowledge']
"""
education
experience
coding_skills
knowledge
"""

52
home/signals.py Normal file
View File

@@ -0,0 +1,52 @@
from django.db.models.signals import post_save, post_delete, m2m_changed
from django.dispatch import receiver
from django.core.cache import cache
from home.models import (Home, AboutMe, MyService, MyServiceTitle, MyResume, Education, Experience, Skill, Knowledge,
MainMenu, Tags)
HOME_CACHE_KEYS = (
'home:active_home',
'home:active_aboutme',
'home:service_list',
'home:service_title',
'home:resume',
'home:education_list',
'home:experience_list',
'home:skill_list',
'home:knowledge_list',
'home:active_menu',
)
def clear_home_cache():
cache.delete_many(HOME_CACHE_KEYS)
@receiver(post_save, sender=Home)
@receiver(post_delete, sender=Home)
@receiver(post_save, sender=AboutMe)
@receiver(post_delete, sender=AboutMe)
@receiver(post_save, sender=MyService)
@receiver(post_delete, sender=MyService)
@receiver(post_save, sender=MyServiceTitle)
@receiver(post_delete, sender=MyServiceTitle)
@receiver(post_save, sender=MyResume)
@receiver(post_delete, sender=MyResume)
@receiver(post_save, sender=Education)
@receiver(post_delete, sender=Education)
@receiver(post_save, sender=Experience)
@receiver(post_delete, sender=Experience)
@receiver(post_save, sender=Skill)
@receiver(post_delete, sender=Skill)
@receiver(post_save, sender=Knowledge)
@receiver(post_delete, sender=Knowledge)
@receiver(post_save, sender=MainMenu)
@receiver(post_delete, sender=MainMenu)
def clear_home_cache_on_save(sender, instance, **kwargs):
clear_home_cache()
@receiver(m2m_changed, sender=Home.tags.through)
def clear_home_cache_on_tags_change(sender, instance, action, **kwargs):
if action in {"post_add", "post_remove", "post_clear"}:
clear_home_cache()

3
home/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

19
home/urls.py Normal file
View File

@@ -0,0 +1,19 @@
from django.urls import path
from home.views import (HomeDetailView, AboutMeDetailView, MyServiceList, MyServiceTitleDetailView,
MyResumeDetailView, EducationListView, ExperienceListView, SkillListView, KnowledgeListView,
MainMenuDetailView, HomeBundleView)
urlpatterns = [
path('home/', HomeDetailView.as_view(), name='home'),
path('aboutme/', AboutMeDetailView.as_view(), name='aboutme'),
path('services/', MyServiceList.as_view(), name='services'),
path('services-title/', MyServiceTitleDetailView.as_view(), name='services-title'),
path('resume/', MyResumeDetailView.as_view(), name='resume'),
path('education/', EducationListView.as_view(), name='education'),
path('experience/', ExperienceListView.as_view(), name='experience'),
path('skills/', SkillListView.as_view(), name='skills'),
path('knowledge/', KnowledgeListView.as_view(), name='knowledge'),
path('main-menu/', MainMenuDetailView.as_view(), name='main.menu'),
path('bundle/', HomeBundleView.as_view(), name='home.bundle'),
]

250
home/views.py Normal file
View File

@@ -0,0 +1,250 @@
from django.core.cache import cache
from rest_framework import status
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from core.Permission import ReadOnly
from home.models import Home, AboutMe, MyService, MyServiceTitle, MyResume, Education, Experience, Skill, Knowledge, \
MainMenu
from home.serializers import (HomeSerializer, AboutMeSerializer, MyServiceSerializer, MyServiceTitleSerializer,
MyResumeSerializer, EducationSerializer, ExperienceSerializer, SkillSerializer,
KnowledgeSerializer, MainMenuSerializer)
CACHE_TTL_SECONDS = 60 * 5
# Create your views here.
class HomeDetailView(APIView):
permission_classes = [ReadOnly]
def get(self, request):
try:
cache_key = 'home:active_home'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
home = Home.objects.filter(is_active=True).first()
if home:
serializer = HomeSerializer(home)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL_SECONDS)
return Response(serializer.data)
else:
return Response({"error": "No settings found"}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class AboutMeDetailView(APIView):
permission_classes = [ReadOnly]
def get(self, request):
try:
cache_key = 'home:active_aboutme'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
aboutme = AboutMe.objects.filter(is_active=True).first()
if aboutme:
serializer = AboutMeSerializer(aboutme)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL_SECONDS)
return Response(serializer.data)
else:
return Response({"error": "No settings found"}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class MyServiceList(ListAPIView):
permission_classes = [ReadOnly]
queryset = MyService.objects.order_by('-created_at').filter(is_active=True).all()
serializer_class = MyServiceSerializer
def list(self, request, *args, **kwargs):
cache_key = 'home:service_list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
response = super().list(request, *args, **kwargs)
cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS)
return response
class MyServiceTitleDetailView(APIView):
permission_classes = [ReadOnly]
def get(self, request):
try:
cache_key = 'home:service_title'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
services_title = MyServiceTitle.objects.filter(is_active=True).first()
if services_title:
serializer = MyServiceTitleSerializer(services_title)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL_SECONDS)
return Response(serializer.data)
else:
return Response({"error": "No settings found"}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class MyResumeDetailView(APIView):
permission_classes = [ReadOnly]
def get(self, request):
try:
cache_key = 'home:resume'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
resume = MyResume.objects.filter(is_active=True).first()
if resume:
serializer = MyResumeSerializer(resume, context={'request': request})
cache.set(cache_key, serializer.data, timeout=CACHE_TTL_SECONDS)
return Response(serializer.data)
else:
return Response({"error": "No resume found"}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class EducationListView(ListAPIView):
permission_classes = [ReadOnly]
serializer_class = EducationSerializer
def get_queryset(self):
return Education.objects.filter(is_active=True).order_by('-created_at')
def list(self, request, *args, **kwargs):
cache_key = 'home:education_list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
response = super().list(request, *args, **kwargs)
cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS)
return response
class ExperienceListView(ListAPIView):
permission_classes = [ReadOnly]
serializer_class = ExperienceSerializer
def get_queryset(self):
return Experience.objects.filter(is_active=True).order_by('-created_at')
def list(self, request, *args, **kwargs):
cache_key = 'home:experience_list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
response = super().list(request, *args, **kwargs)
cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS)
return response
class SkillListView(ListAPIView):
permission_classes = [ReadOnly]
serializer_class = SkillSerializer
def get_queryset(self):
return Skill.objects.filter(is_active=True).order_by('-created_at')
def list(self, request, *args, **kwargs):
cache_key = 'home:skill_list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
response = super().list(request, *args, **kwargs)
cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS)
return response
class KnowledgeListView(ListAPIView):
permission_classes = [ReadOnly]
serializer_class = KnowledgeSerializer
def get_queryset(self):
return Knowledge.objects.filter(is_active=True).order_by('-created_at')
def list(self, request, *args, **kwargs):
cache_key = 'home:knowledge_list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
response = super().list(request, *args, **kwargs)
cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS)
return response
class HomeBundleView(APIView):
permission_classes = [ReadOnly]
def get(self, request):
try:
cache_key = 'home:bundle:v1'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
home = Home.objects.filter(is_active=True).first()
aboutme = AboutMe.objects.filter(is_active=True).first()
services_title = MyServiceTitle.objects.filter(is_active=True).first()
resume = MyResume.objects.filter(is_active=True).first()
menu = MainMenu.objects.filter(is_active=True).first()
services = MyService.objects.filter(is_active=True).order_by('-created_at')
education = Education.objects.filter(is_active=True).order_by('-created_at')
experience = Experience.objects.filter(is_active=True).order_by('-created_at')
skills = Skill.objects.filter(is_active=True).order_by('-created_at')
knowledge = Knowledge.objects.filter(is_active=True).order_by('-created_at')
payload = {
"home": HomeSerializer(home).data if home else None,
"about_me": AboutMeSerializer(aboutme).data if aboutme else None,
"service_title": MyServiceTitleSerializer(services_title).data if services_title else None,
"resume": MyResumeSerializer(resume, context={"request": request}).data if resume else None,
"main_menu": MainMenuSerializer(menu).data if menu else None,
"services": MyServiceSerializer(services, many=True).data,
"education": EducationSerializer(education, many=True).data,
"experience": ExperienceSerializer(experience, many=True).data,
"skills": SkillSerializer(skills, many=True).data,
"knowledge": KnowledgeSerializer(knowledge, many=True).data,
}
cache.set(cache_key, payload, timeout=CACHE_TTL_SECONDS)
return Response(payload)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
class MainMenuDetailView(APIView):
permission_classes = [ReadOnly]
def get(self, request):
try:
cache_key = 'home:active_menu'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
# Cache'de yoksa veritabanından al
menu = MainMenu.objects.filter(is_active=True).first()
if menu:
serializer = MainMenuSerializer(menu)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL_SECONDS)
return Response(serializer.data)
else:
return Response({"error": "No settings found"}, status=status.HTTP_404_NOT_FOUND)
except Exception as e:
return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)