mirror of
https://github.com/dolphin-emu/www.git
synced 2026-01-31 01:05:23 +01:00
147 lines
4.5 KiB
Python
147 lines
4.5 KiB
Python
# Copyright (c) 2018 Dolphin Emulator Website Contributors
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from datetime import datetime
|
|
from django.conf import settings
|
|
from django.core.cache import cache
|
|
from django.db import models
|
|
|
|
import urllib.parse
|
|
|
|
class Namespace(object):
|
|
MAIN = 0
|
|
TALK = 1
|
|
USER = 2
|
|
USER_TALK = 3
|
|
PROJECT = 4
|
|
PROJECT_TALK = 5
|
|
FILE = 6
|
|
FILE_TALK = 7
|
|
MEDIAWIKI = 8
|
|
MEDIAWIKI_TALK = 9
|
|
TEMPLATE = 10
|
|
TEMPLATE_TALK = 11
|
|
HELP = 12
|
|
HELP_TALK = 13
|
|
CATEGORY = 14
|
|
CATEGORY_TALK = 15
|
|
|
|
class Text(models.Model):
|
|
id = models.IntegerField(db_column='old_id', primary_key=True)
|
|
data_raw = models.TextField(db_column='old_text')
|
|
|
|
@property
|
|
def data(self):
|
|
return self.data_raw
|
|
|
|
def __str__(self):
|
|
return 'Blob %d: %s' % (self.id, self.data[:100])
|
|
|
|
class Meta:
|
|
db_table = 'text'
|
|
verbose_name = 'MediaWiki Text Blob'
|
|
verbose_name_plural = 'MediaWiki Text Blobs'
|
|
|
|
class Revision(models.Model):
|
|
id = models.IntegerField(db_column='rev_id', primary_key=True)
|
|
page = models.ForeignKey('Page', on_delete=models.PROTECT, db_column='rev_page', related_name='+')
|
|
text = models.ForeignKey('Text', on_delete=models.PROTECT, db_column='rev_text_id', related_name='+')
|
|
timestamp = models.CharField(db_column='rev_timestamp', max_length=14)
|
|
|
|
def __str__(self):
|
|
return '%s for %s' % (self.timestamp, self.page)
|
|
|
|
class Meta:
|
|
db_table = 'old_revision'
|
|
verbose_name = 'MediaWiki Revision'
|
|
verbose_name_plural = 'MediaWiki Revisions'
|
|
|
|
class Page(models.Model):
|
|
id = models.IntegerField(db_column='page_id', primary_key=True)
|
|
namespace = models.IntegerField(db_column='page_namespace')
|
|
title_url = models.CharField(db_column='page_title', max_length=255)
|
|
len = models.IntegerField(db_column='page_len')
|
|
latest = models.ForeignKey('Revision', on_delete=models.PROTECT, db_column='page_latest', related_name='+')
|
|
is_redirect = models.BooleanField(db_column='page_is_redirect', default=False)
|
|
|
|
@property
|
|
def wiki_url(self):
|
|
u = self.title_url
|
|
if u.startswith('Ratings/'):
|
|
u = u[len('Ratings/'):]
|
|
return settings.WIKI_URL + 'index.php?title=%s' % urllib.parse.quote(u)
|
|
|
|
@property
|
|
def title(self):
|
|
s = self.title_url.replace('_', ' ')
|
|
if s.startswith('Ratings/'):
|
|
s = s[len('Ratings/'):]
|
|
return s
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
class Meta:
|
|
db_table = 'page'
|
|
ordering = ['namespace', 'title_url']
|
|
verbose_name = 'MediaWiki Page'
|
|
verbose_name_plural = 'MediaWiki Pages'
|
|
|
|
class Category(models.Model):
|
|
id = models.IntegerField(db_column='cat_id', primary_key=True)
|
|
title = models.CharField(db_column='cat_title', max_length=255)
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
class Meta:
|
|
db_table = 'category'
|
|
ordering = ['title']
|
|
verbose_name = 'MediaWiki Category'
|
|
verbose_name_plural = 'MediaWiki Categories'
|
|
|
|
class CategoryLink(models.Model):
|
|
id = models.IntegerField(primary_key=True, db_column='cl_sortkey') ## UGLY, not PK in DB
|
|
page = models.ForeignKey('Page', on_delete=models.PROTECT, db_column='cl_from', related_name='+')
|
|
cat = models.CharField(db_column='cl_to', max_length=255)
|
|
|
|
def __str__(self):
|
|
return 'Link from %s to %s' % (self.page, self.cat)
|
|
|
|
class Meta:
|
|
db_table = 'categorylinks'
|
|
ordering = ['cat', 'page']
|
|
verbose_name = 'MediaWiki Category Link'
|
|
verbose_name_plural = 'MediaWiki Category Links'
|
|
|
|
def get_rated_games():
|
|
count = cache.get('rating_count')
|
|
if count is None:
|
|
count = Page.objects.filter(namespace=Namespace.TEMPLATE, title_url__startswith='Ratings/',
|
|
latest__text__data_raw__in=('1', '2', '3', '4', '5')).count()
|
|
cache.set('rating_count', count, 300)
|
|
return count
|
|
|
|
def get_rating_count(n):
|
|
if n < 1 or n > 5:
|
|
return 0
|
|
|
|
count = cache.get('rating_count_%d' % n)
|
|
if count is None:
|
|
count = Page.objects.filter(namespace=Namespace.TEMPLATE, title_url__startswith='Ratings/',
|
|
latest__text__data_raw=str(n)).count()
|
|
cache.set('rating_count_%d' % n, count, 300)
|
|
|
|
return count
|
|
|
|
def get_category_id(name):
|
|
id = cache.get('category_name_%s' % name)
|
|
if id is None:
|
|
try:
|
|
id = Category.objects.get(title=name)
|
|
except Category.DoesNotExist:
|
|
return 0
|
|
cache.set('category_name_%s' % name, id)
|
|
|
|
return id
|