Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
50d8ad4
initial
Denactive Mar 29, 2021
218a60f
gitignore minor
Denactive Mar 29, 2021
ce1d62f
strange merging
Denactive Mar 29, 2021
6b3df66
main page witthout info
Denactive Apr 14, 2021
30e91f2
before background picts added
Denactive Apr 16, 2021
0d85eb4
base / main done
Denactive Apr 16, 2021
a1143ff
done base and main
Denactive Apr 17, 2021
bae1628
start working with django
Denactive Apr 17, 2021
408f8f1
start working with django/2
Denactive Apr 17, 2021
79ac956
topics links changed to tags
Denactive Apr 17, 2021
1ff46eb
fixed tags in question page
Denactive Apr 17, 2021
2e18b0b
fixed tags in index
Denactive Apr 17, 2021
3deb580
fixed sm / xl
Denactive Apr 17, 2021
4ab4df7
reorganised xl/sm
Denactive Apr 17, 2021
75f5751
using fixed tags as a template
Denactive Apr 17, 2021
a4cf274
static done. Login page buttons and refs bug has been fixed
Denactive Apr 18, 2021
244beb2
rubbish clear
Denactive Apr 18, 2021
2bb948d
deleted '<' sym in question
Denactive Apr 18, 2021
cf288a9
main done. TODO paginator, tag reverse links, search
Denactive Apr 19, 2021
7be7393
fuck this db
Denactive Apr 20, 2021
d6a76ca
recreated db
Denactive Apr 20, 2021
1bf969a
fixed bug in db. now works
Denactive Apr 20, 2021
469f493
что-то там фурчит, но ттолько не запросы
Denactive Apr 20, 2021
eb3eb0f
last commit before arival
Denactive May 1, 2021
cdebfc4
paginator | start work on user models
Denactive May 29, 2021
be48900
prefetch requests done | before db reset
Denactive May 30, 2021
eebca5a
answers update done
Denactive May 30, 2021
6b7d0e5
likes done
Denactive May 30, 2021
ffca896
generator done
Denactive May 30, 2021
6060232
problems with popular: pk ???
Denactive May 30, 2021
4b66a2c
dz-3 done
Denactive May 31, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
node_modules
.node_modules
.suo
slnx.sqlite
VSWorkspaceState.json
.vs
node_modules/
package.json
package-lock.json
server.js

.vs/
askme_turchin/venv
askme_turchin/.idea/
askme_turchin/.vscode/
askme_turchin/*.pyc
askme_turchin/__pycache__/
askme_turchin/askme_turchin/__pycache__/
askme_turchin/requirements.txt
.idea/
.vscode/
*.pyc
__pycache__/

возможные\ темы.txt
Empty file added askme_turchin/app/__init__.py
Empty file.
38 changes: 38 additions & 0 deletions askme_turchin/app/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from django.contrib import admin
from app.models import Question, Answer, Tag, Profile, QuestionRatingMark, AnswerRatingMark

# Register your models here.

class AnswerRatingInline(admin.StackedInline):
model = AnswerRatingMark
extra = 1

class AnswerAdmin(admin.ModelAdmin):
fields = ['fk_question', 'fk_profile', 'text', 'marked_correct' ]
list_filter = ['date']
inlines = [AnswerRatingInline]

class QuestionAnswerInline(admin.StackedInline):
#TODO: forbid rating change here
model = Answer
extra = 1

class QuestionRatingInline(admin.StackedInline):
model = QuestionRatingMark
extra = 1

class QuestionAdmin(admin.ModelAdmin):
fields = ['fk_profile', 'fk_tags', 'title', 'text']
inlines = [QuestionAnswerInline, QuestionRatingInline]
list_filter = ['date']

class UserAdmin(admin.ModelAdmin):
list_filter = ['reg_date']


admin.site.register(Question, QuestionAdmin)
admin.site.register(Answer, AnswerAdmin)
admin.site.register(Tag)
admin.site.register(Profile)
admin.site.register(QuestionRatingMark)
admin.site.register(AnswerRatingMark)
5 changes: 5 additions & 0 deletions askme_turchin/app/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class AppConfig(AppConfig):
name = 'app'
7 changes: 7 additions & 0 deletions askme_turchin/app/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django import forms

class LoginForm(forms.Form):
email = forms.EmailField()
password = form.CharField(request=False)


171 changes: 171 additions & 0 deletions askme_turchin/app/management/commands/dbfill.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
from random import choice
from itertools import islice
from django.core.management.base import BaseCommand
from app.models import Profile, Tag, Question, Answer, QuestionRatingMark, AnswerRatingMark
from django.contrib.auth.models import User
from faker import Faker
import glob
import random
from random import shuffle, seed
from faker.providers.person.en import Provider

class Command(BaseCommand):
help = "filling db with random data"

def add_arguments(self, parcer):
parcer.add_argument("-u", "--users", type=int)
parcer.add_argument("-t", "--tags", type=int)
parcer.add_argument("-q", "--questions", type=int)
parcer.add_argument("-a", "--answers", type=int)
parcer.add_argument("-ql", "--question_likes", type=int)
parcer.add_argument("-al", "--answer_likes", type=int)
# parcer.add_argument("-amc", "--answer_marked_correct", type=int)
parcer.add_argument("-all", "--all", type=int)


def handle(self, *args, **options):
users_amount = options["users"]
questions_amount = options["questions"]
answers_amount = options["answers"]
tags_amount = options["tags"]
question_votes_amount = options["question_likes"]
answer_votes_amount = options["answer_likes"]
total_amount = options["all"]

if total_amount:
self.fill_tags(total_amount * 10)
self.fill_users(total_amount * 10)
self.fill_questions(total_amount * 100)
self.fill_answers(total_amount * 300)
self.fill_question_likes(total_amount * 600)
self.fill_answer_likes(total_amount * 500)
if tags_amount:
self.fill_tags(tags_amount * 10)
if users_amount:
self.fill_users(users_amount * 10)
if questions_amount:
self.fill_questions(questions_amount * 100)
if answers_amount:
self.fill_answers(answers_amount * 300)
if question_votes_amount:
self.fill_question_likes(question_votes_amount * 600)
if answer_votes_amount:
self.fill_answer_likes(answer_votes_amount * 500)


def fill_questions(self, n):
users = list(Profile.objects.values_list('id', flat=True))
tags = list(Tag.objects.values_list('tagname', flat=True))
for i in range(n):
question = Question.objects.create(
fk_profile_id=choice(users),
title=Faker().sentence()[:200],
text=". ".join(
Faker().sentences(
Faker().random_int(min=2, max=5)
)
),
date=Faker().date_between("-100d", "today"),
)
question.fk_tags.add(choice(tags))


def fill_answers(self, n):
print("filling ", n, " answers")

questions = list(Question.objects.values_list("id", flat=True))
users = list(Profile.objects.values_list("id", flat=True))
answers = []

for i in range(n):
answer = Answer(
fk_question_id=choice(questions),
fk_profile_id=choice(users),
text=". ".join(Faker().sentences(Faker().random_int(min=2, max=5))),
)
if (Faker().random_int(min=0, max=5) == 0):
answer.marked_correct = True
answers.append(answer)

batch_size = 100
n_batches = len(answers) // batch_size
if len(answers) % batch_size != 0:
n_batches += 1
for i in range(n_batches):
start = batch_size * i
end = batch_size * (i + 1)
Answer.objects.bulk_create(answers[start:end], batch_size)

def fill_users(self, n):
usernames = set()

file_path_type = "img/*.png"
images = glob.glob(file_path_type)


while len(usernames) != n:
usernames.add(Faker().user_name() + "№" + str(Faker().random.randint(0, 1000000)))

for name in usernames:
user = User.objects.create(
username=name,
password=Faker().password(),
email=Faker().email()
)
Profile.objects.create(
user = user,
avatarlink = choice(images)
)


def fill_tags(self, n):
first_names = list(set(Provider.first_names))
seed(4321)
shuffle(first_names)

for i in range(n):
Tag.objects.create(tagname=Faker().word() + "№" + str(Faker().random.randint(0,100000)))


def fill_question_likes(self, n):
questions = list(Question.objects.values_list("id", flat=True))
users = list(Profile.objects.values_list("id", flat=True))
votes = []

for i in range(n):
vote = QuestionRatingMark(
fk_question_id=choice(questions),
fk_profile_id=choice(users),
vote=Faker().random.randint(-1, 1)
)
votes.append(vote)

batch_size = 100
n_batches = len(votes) // batch_size
if len(votes) % batch_size != 0:
n_batches += 1
for i in range(n_batches):
start = batch_size * i
end = batch_size * (i + 1)
QuestionRatingMark.objects.bulk_create(votes[start:end], batch_size)

def fill_answer_likes(self, n):
answers = list(Answer.objects.values_list("id", flat=True))
users = list(Profile.objects.values_list("id", flat=True))
votes = []

for i in range(n):
vote = AnswerRatingMark(
fk_answer_id=choice(answers),
fk_profile_id=choice(users),
vote=Faker().random.randint(-1, 1))
votes.append(vote)

batch_size = 100
n_batches = len(votes) // batch_size
if len(votes) % batch_size != 0:
n_batches += 1
for i in range(n_batches):
start = batch_size * i
end = batch_size * (i + 1)
AnswerRatingMark.objects.bulk_create(votes[start:end], batch_size)
77 changes: 77 additions & 0 deletions askme_turchin/app/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Generated by Django 2.2.20 on 2021-05-30 14:47

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Profile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('avatarlink', models.CharField(default=None, max_length=255)),
('user', models.OneToOneField(default=None, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'User profile',
'verbose_name_plural': 'User profiles',
},
),
migrations.CreateModel(
name='Tag',
fields=[
('tagname', models.CharField(max_length=255, primary_key=True, serialize=False)),
],
options={
'verbose_name': 'Tag',
'verbose_name_plural': 'Tags',
'db_table': 'tags',
'managed': True,
},
),
migrations.CreateModel(
name='Question',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rating', models.IntegerField(default=0)),
('title', models.CharField(max_length=255)),
('text', models.TextField()),
('date', models.DateTimeField(auto_now_add=True)),
('fk_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Profile')),
('fk_tags', models.ManyToManyField(to='app.Tag')),
],
options={
'verbose_name': 'Question',
'verbose_name_plural': 'Questions',
'db_table': 'questions',
'managed': True,
},
),
migrations.CreateModel(
name='Answer',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rating', models.IntegerField(default=0)),
('text', models.TextField()),
('date', models.DateTimeField(auto_now_add=True)),
('marked_correct', models.BooleanField(default=False)),
('fk_profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Profile')),
('fk_question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.Question')),
],
options={
'verbose_name': 'Answer',
'verbose_name_plural': 'Answers',
'db_table': 'answers',
'managed': True,
},
),
]
18 changes: 18 additions & 0 deletions askme_turchin/app/migrations/0002_question_answers_num.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.2.20 on 2021-05-30 15:00

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='question',
name='answers_num',
field=models.IntegerField(default=0),
),
]
18 changes: 18 additions & 0 deletions askme_turchin/app/migrations/0003_auto_20210530_1823.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 2.2.20 on 2021-05-30 15:23

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('app', '0002_question_answers_num'),
]

operations = [
migrations.RenameField(
model_name='question',
old_name='answers_num',
new_name='_answers_num',
),
]
Loading