first commit
This commit is contained in:
0
home/__init__.py
Normal file
0
home/__init__.py
Normal file
BIN
home/__pycache__/__init__.cpython-314.pyc
Normal file
BIN
home/__pycache__/__init__.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/admin.cpython-314.pyc
Normal file
BIN
home/__pycache__/admin.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/apps.cpython-314.pyc
Normal file
BIN
home/__pycache__/apps.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/models.cpython-314.pyc
Normal file
BIN
home/__pycache__/models.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/serializers.cpython-314.pyc
Normal file
BIN
home/__pycache__/serializers.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/signals.cpython-314.pyc
Normal file
BIN
home/__pycache__/signals.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/tests.cpython-314.pyc
Normal file
BIN
home/__pycache__/tests.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/urls.cpython-314.pyc
Normal file
BIN
home/__pycache__/urls.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/__pycache__/views.cpython-314.pyc
Normal file
BIN
home/__pycache__/views.cpython-314.pyc
Normal file
Binary file not shown.
415
home/admin.py
Normal file
415
home/admin.py
Normal 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
8
home/apps.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class HomeConfig(AppConfig):
|
||||
name = 'home'
|
||||
|
||||
def ready(self):
|
||||
import home.signals
|
||||
57
home/migrations/0001_initial.py
Normal file
57
home/migrations/0001_initial.py
Normal 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',)},
|
||||
},
|
||||
),
|
||||
]
|
||||
18
home/migrations/0002_home_video.py
Normal file
18
home/migrations/0002_home_video.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
52
home/migrations/0003_aboutme.py
Normal file
52
home/migrations/0003_aboutme.py
Normal 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',)},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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ı'),
|
||||
),
|
||||
]
|
||||
18
home/migrations/0006_aboutme_counter_active.py
Normal file
18
home/migrations/0006_aboutme_counter_active.py
Normal 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ı ?'),
|
||||
),
|
||||
]
|
||||
@@ -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ı ?'),
|
||||
),
|
||||
]
|
||||
37
home/migrations/0008_myservice.py
Normal file
37
home/migrations/0008_myservice.py
Normal 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',)},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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ığı '),
|
||||
),
|
||||
]
|
||||
30
home/migrations/0010_myservicetitle.py
Normal file
30
home/migrations/0010_myservicetitle.py
Normal 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'],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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'],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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'},
|
||||
),
|
||||
]
|
||||
17
home/migrations/0014_alter_education_options.py
Normal file
17
home/migrations/0014_alter_education_options.py
Normal 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'},
|
||||
),
|
||||
]
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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 '),
|
||||
),
|
||||
]
|
||||
@@ -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 '),
|
||||
),
|
||||
]
|
||||
34
home/migrations/0019_mainmenu.py
Normal file
34
home/migrations/0019_mainmenu.py
Normal 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'],
|
||||
},
|
||||
),
|
||||
]
|
||||
0
home/migrations/__init__.py
Normal file
0
home/migrations/__init__.py
Normal file
BIN
home/migrations/__pycache__/0001_initial.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/0001_initial.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/migrations/__pycache__/0002_home_video.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/0002_home_video.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/migrations/__pycache__/0003_aboutme.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/0003_aboutme.cpython-314.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
home/migrations/__pycache__/0008_myservice.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/0008_myservice.cpython-314.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
home/migrations/__pycache__/0010_myservicetitle.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/0010_myservicetitle.cpython-314.pyc
Normal 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.
BIN
home/migrations/__pycache__/0019_mainmenu.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/0019_mainmenu.cpython-314.pyc
Normal file
Binary file not shown.
BIN
home/migrations/__pycache__/__init__.cpython-314.pyc
Normal file
BIN
home/migrations/__pycache__/__init__.cpython-314.pyc
Normal file
Binary file not shown.
340
home/models.py
Normal file
340
home/models.py
Normal 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
114
home/serializers.py
Normal 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
52
home/signals.py
Normal 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
3
home/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
19
home/urls.py
Normal file
19
home/urls.py
Normal 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
250
home/views.py
Normal 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)
|
||||
Reference in New Issue
Block a user