realsuayip / django-sozluk

an exhaustive ekşi sözlük clone, powered by Python
https://sozluk.me
BSD 3-Clause "New" or "Revised" License
320 stars 79 forks source link

Eksikler #101

Closed bilgehanars closed 4 months ago

bilgehanars commented 4 months ago

IP Kaydı yok. kullancaksanız girilen entryler ile ilgili siz sorumlusunuz. / üzerinde çalışıyorum.


Kullanıcı adı değşiminde db üzerinde slug kısmı var onun da değişmesi gerekiyor. değişmiyor


email kısmı case sensitive - eğer hesabınız varsa tek bir harf büyük şekilde hesabınızın üstüne hesap açılıp hesabınız bloke olabiliyor.


kullanıcı adı full küçük harf değilse geçersiz karakter hatası veriyor / javascript ile hallettim.

function toTurkishLowerCase(str) {
    const turkishDict = {
        'Ç': 'ç', 'Ğ': 'ğ', 'I': 'ı', 'İ': 'i', 'Ö': 'ö', 'Ş': 'ş', 'Ü': 'ü'
    };
    return str.replace(/[ÇĞIİÖŞÜ]/g, function(match) {
        return turkishDict[match];
    }).toLowerCase();
}

document.addEventListener('DOMContentLoaded', function () {
    if (window.location.href === 'https://SITEADINIZ.COM/register/') {
        var inputElement = document.getElementById('signup_username');
        inputElement.addEventListener('input', function() {
            this.value = toTurkishLowerCase(this.value);
        });
    }
});

?a=today ve ?a=popular şeklinde Google'dan gelen istekler boş sayfa dönütü verebiliyor. o gün orada entry yoksa, seo için çok kötü. /ufak bir javascript ile hallettim.


// URL'deki belirli bir parametreyi kaldırarak yeniden yönlendirme
function redirectToBaseURLIfNoEntry() {
    const url = new URL(window.location);
    const entryExists = document.querySelector(".entry-full"); // Entry olup olmadığını kontrol edin

    if (!entryExists && url.searchParams.has("a")) {
        url.searchParams.delete("a");
        window.location.href = url.pathname + url.search; // Query params olmadan yönlendirir
    }
}

// Sayfa içeriği tamamen yüklendiğinde kontrol edin ve gerekirse yönlendirin
document.addEventListener("DOMContentLoaded", () => {
    redirectToBaseURLIfNoEntry();
});

Bonus database yedekleme oluşturmak için bash script:

#!/bin/bash

# Değişkenlerin tanımlanması
CONTAINER_NAME="sozluk_db"
POSTGRES_USER="db_dictionary_user"
HOME_BACKUP_DIR="/root/backupdb"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="backup_$TIMESTAMP.sql"
CONTAINER_BACKUP_PATH="/tmp/$BACKUP_FILE"

# Yedekleme işlemi
echo "Yedekleme işlemi başlatılıyor..."
docker exec $CONTAINER_NAME pg_dumpall -U $POSTGRES_USER -f $CONTAINER_BACKUP_PATH
if [ $? -eq 0 ]; then
    echo "Yedekleme işlemi başarılı. Dosya container içinde: $CONTAINER_BACKUP_PATH"
else
    echo "Yedekleme işlemi başarısız."
    exit 1
fi

# Host sistemine yedek dosyasını kopyalama
docker cp $CONTAINER_NAME:$CONTAINER_BACKUP_PATH $HOME_BACKUP_DIR/$BACKUP_FILE
if [ $? -eq 0 ]; then
    echo "Yedek dosyası başarıyla host sistemine kopyalandı: $HOME_BACKUP_DIR/$BACKUP_FILE"
    docker exec $CONTAINER_NAME rm $CONTAINER_BACKUP_PATH
else
    echo "Yedek dosyasını host sistemine kopyalama başarısız."
    exit 1
fi

echo "Yedekleme işlemi tamamlandı."
realsuayip commented 4 months ago

teşekkürler.

IP adresi kaydı -> evet bu yapılmıyor, dileyenler hem entry hem de user üzerinden IP kaydı yapılabilir, IP'nin nasıl kullanılacağına göre.

kullancı adı slug -> evet bu da bilinen bi durum, kendi issue'si da var. şu an platform username değişikliğine izin vermiyor.

email -> bunu araştıracağım. muhtemelen bir bug fix çıkarım

kullanıcı adı full küçük harf değilse -> evet, ufak bir hata, genel olarak platformda büyük harf kullanımına izin yok.

Google'dan gelen istekler -> normal başlıklar sitemap'da da var. olağan şartlarda "olgunlaşan" başlıklar için google'nin query parametresiz olarak da sayfaları indexleyeceğini düşünüyorum. zaten bu parametrelerle içerik olmadığını google da bildiği için zamanla düz başlık sayfaları index'lenecektir çoğunlukla.

belki sol frame'da bunlar için nofollow konulabilir.

bilgehanars commented 4 months ago

Lütfen aşağıdaki değişiklikleri yapacak olan varsa yapmadan önce daha önceden belirttiğim bash script ile db backup alsın

aşağıdaki dosyayı değiştirince sorunun çözülmesi lazım. emaili kayıt olurken ve oturum açarken komple küçük harf olarak kabul ediyor. model olarak güncellemek de lazım ama bu da yetebilir.

dictionary/forms/auth.py

from django import forms
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.forms.widgets import SelectDateWidget
from django.utils.translation import gettext, gettext_lazy as _

from dictionary.models import AccountTerminationQueue, Author

class LoginForm(AuthenticationForm):
    error_messages = {
        "invalid_login": (
            _(
                "could not log in. make sure that you entered correct"
                " combination of e-mail and password. your credentials are"
                " case sensitive. make sure that you confirmed your e-mail."
            )
        )
    }
    remember_me = forms.BooleanField(required=False, label=_("remember me"))

    def clean_username(self):
        username = self.cleaned_data.get('username')
        return username.lower() if username else None

class SignUpForm(UserCreationForm):
    email = forms.EmailField(
        max_length=254,
        help_text=_("required. in order to complete registration, provide a valid e-mail address."),
        label=_("e-mail"),
    )
    gender = forms.ChoiceField(choices=Author.Gender.choices, label=_("gender"))
    birth_date = forms.DateField(widget=SelectDateWidget(years=range(2006, 1900, -1)), label=_("birth date"))
    terms_conditions = forms.BooleanField(required=True)

    class Meta:
        model = Author
        fields = (
            "username",
            "email",
            "password1",
            "password2",
        )
        labels = {"username": _("nickname")}

    def clean_email(self):
        email = self.cleaned_data.get('email')
        return email.lower() if email else None

class ResendEmailForm(forms.Form):
    email = forms.EmailField(max_length=254, label=_("the e-mail address you used to register your account"))

    def clean(self):
        if not self.errors:
            try:
                email = self.cleaned_data.get("email").lower()
                author = Author.objects.get(email=email)
                if author.is_active:
                    raise forms.ValidationError(gettext("this e-mail has already been confirmed."))
            except Author.DoesNotExist as exc:
                raise forms.ValidationError(gettext("no such e-mail, never heard of it.")) from exc

        super().clean()

class ChangeEmailForm(forms.Form):
    email1 = forms.EmailField(max_length=254, label=_("new e-mail address"))
    email2 = forms.EmailField(max_length=254, label=_("new e-mail address (again)"))
    password_confirm = forms.CharField(label=_("confirm your password"), strip=False, widget=forms.PasswordInput)

    def clean(self):
        form_data = self.cleaned_data

        email1 = form_data.get("email1").lower()
        email2 = form_data.get("email2").lower()

        if email1 != email2:
            raise forms.ValidationError(gettext("e-mails didn't match."))

        if Author.objects.filter(email=email1).exists():
            raise forms.ValidationError(gettext("this e-mail is already in use."))

        super().clean()

class TerminateAccountForm(forms.ModelForm):
    password_confirm = forms.CharField(label=_("confirm your password"), strip=False, widget=forms.PasswordInput)

    class Meta:
        model = AccountTerminationQueue
        fields = ("state",)

Ayrıca zaten kayıtlı kullanıcıların maillerini komple küçük harfe çevirmek için de management/commands/normalize_emails.py dosyası oluşturulup db güncellenebilir

from django.core.management.base import BaseCommand
from dictionary.models import Author

class Command(BaseCommand):
    help = 'Normalize email addresses to lowercase'

    def handle(self, *args, **kwargs):
        users = Author.objects.all()
        for user in users:
            user.email = user.email.lower()
            user.save()
        self.stdout.write(self.style.SUCCESS('Successfully normalized email addresses'))

değişiklikleri uygulayıp yeniden başlattıktan sonra

docker exec -it sozluk_backend python manage.py normalize_emails

şeklinde sonuç alınabilir

bilgehanars commented 4 months ago

ayrıca slugları komut olarak komple kullanıcı adına eşitlemek için manage.py'de şu şekilde bir komut dosyası oluşturulabilir, bende işe yaradı:

from django.core.management.base import BaseCommand
from dictionary.models import Author
from uuslug import uuslug

class Command(BaseCommand):
    help = 'Update slugs for all authors based on their usernames'

    def handle(self, *args, **kwargs):
        authors = Author.objects.all()
        for author in authors:
            author.slug = uuslug(author.username, instance=author)
            author.save()
        self.stdout.write(self.style.SUCCESS('Successfully updated slugs for all authors'))

slug kısmının otomatik düzenlenmesi için burayı inceleyebilirsiniz. bunu denemedim. en kısa zamanda deneyeceğim

models/author.py

class Author(AbstractUser):
    # Diğer alanlar ve metodlar...

    slug = models.SlugField(max_length=35, unique=True, editable=False)

    def save(self, *args, **kwargs):
        if not self.slug or 'username' in self.get_dirty_fields():
            self.slug = uuslug(self.username, instance=self)
        super().save(*args, **kwargs)

    def get_dirty_fields(self):
        if not self.pk:
            return {}
        old_instance = Author.objects.filter(pk=self.pk).first()
        dirty_fields = {}
        if old_instance:
            for field in self._meta.fields:
                field_name = field.name
                old_value = getattr(old_instance, field_name)
                new_value = getattr(self, field_name)
                if old_value != new_value:
                    dirty_fields[field_name] = (old_value, new_value)
        return dirty_fields

900 üye ve 10k dan fazla entry'im var sitemde. 2 aylık kullanıcı dönütlerini yazdım uyguladığım bazı çözümleri paylaştım. yanlış bir alan varsa lütfen düzeltin beni

realsuayip commented 4 months ago

@bilgehanars

1.6.0 versiyonunda email problemi ve kullanıcı adı slug problemi çözülüyor. bildirimler için teşekkürler