mirror of
https://github.com/ngfchl/ptools
synced 2023-07-10 13:41:22 +08:00
支持站点用户等级升级信息显示,数据库仍需完善
This commit is contained in:
@@ -13,11 +13,12 @@ import toml
|
||||
import transmission_rpc
|
||||
import yaml
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.forms import model_to_dict
|
||||
from django.http import JsonResponse, FileResponse, HttpResponse, Http404
|
||||
from django.shortcuts import render
|
||||
|
||||
from pt_site.UtilityTool import MessageTemplate, FileSizeConvert
|
||||
from pt_site.models import SiteStatus, MySite, Site, Downloader, TorrentInfo
|
||||
from pt_site.models import SiteStatus, MySite, Site, Downloader, TorrentInfo, UserLevelRule
|
||||
from pt_site.views import scheduler, pt_spider, exec_command, pool
|
||||
from ptools.base import CommonResponse, StatusCodeEnum, DownloaderCategory
|
||||
from ptools.settings import BASE_DIR
|
||||
@@ -616,6 +617,56 @@ def site_status_api(request):
|
||||
'seeding_size': site_info.seed_vol,
|
||||
'last_active': datetime.strftime(site_info.updated_at, '%Y/%m/%d %H:%M:%S'),
|
||||
}
|
||||
try:
|
||||
level_info = my_site.site.userlevelrule_set.filter(level=my_site.my_level).first()
|
||||
|
||||
if not level_info:
|
||||
pass
|
||||
else:
|
||||
if level_info.level_id == 0:
|
||||
site_info.update({
|
||||
'level_info': model_to_dict(level_info),
|
||||
})
|
||||
else:
|
||||
next_level = UserLevelRule.objects.filter(
|
||||
site=my_site.site,
|
||||
level_id=level_info.level_id + 1
|
||||
).first()
|
||||
levels = UserLevelRule.objects.filter(
|
||||
site=my_site.site,
|
||||
level_id__lte=level_info.level_id
|
||||
).order_by('-level_id').values_list('level', 'rights')
|
||||
level_info_dict = model_to_dict(level_info)
|
||||
level_info_dict.update(
|
||||
{
|
||||
'uploaded': FileSizeConvert.parse_2_byte(level_info.uploaded),
|
||||
'downloaded': FileSizeConvert.parse_2_byte(level_info.downloaded),
|
||||
# 'rights': [level.rights for level in levels],
|
||||
'rights': dict(levels),
|
||||
}
|
||||
)
|
||||
next_level_dict = model_to_dict(next_level)
|
||||
next_level_dict.update(
|
||||
{
|
||||
'uploaded': FileSizeConvert.parse_2_byte(next_level.uploaded),
|
||||
'downloaded': FileSizeConvert.parse_2_byte(next_level.downloaded),
|
||||
}
|
||||
)
|
||||
logger.info(f'我的站点id:{my_site.id}')
|
||||
logger.info(f'当前等级:{level_info_dict}')
|
||||
logger.info(f'下一等级:{next_level_dict}')
|
||||
upgrade_day = my_site.time_join + timedelta(days=next_level.days * 7)
|
||||
|
||||
logger.info(f'下一等级升级日期:{upgrade_day}')
|
||||
site_info.update({
|
||||
'level_info': level_info_dict,
|
||||
'next_level': next_level_dict,
|
||||
'upgrade_day': upgrade_day if upgrade_day > datetime.today() else False,
|
||||
})
|
||||
except:
|
||||
# raise
|
||||
logger.warning(f'{my_site.site.name} 用户升级信息获取错误!')
|
||||
pass
|
||||
status_list.append(site_info)
|
||||
# 按上传量排序
|
||||
# status_list.sort(key=lambda x: x['mail'], reverse=False)
|
||||
@@ -654,7 +705,7 @@ def site_status_api(request):
|
||||
message = f'获取数列列表失败:{e}'
|
||||
logger.info(message)
|
||||
logger.error(traceback.format_exc(limit=3))
|
||||
return CommonResponse.error(msg=message)
|
||||
return JsonResponse(data=CommonResponse.error(msg=message).to_dict(), safe=False)
|
||||
|
||||
|
||||
@login_required
|
||||
|
||||
@@ -206,7 +206,7 @@ class UserLevelRuleAdmin(AjaxAdmin):
|
||||
'score',
|
||||
'ratio',
|
||||
'torrents',
|
||||
'rights',
|
||||
# 'rights',
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.1.2 on 2023-01-07 21:13
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('pt_site', '0028_userlevelrule'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='userlevelrule',
|
||||
name='downloaded',
|
||||
field=models.CharField(default=0, help_text='原样输入,例:50GB,1.5TB', max_length=12, verbose_name='下 载'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userlevelrule',
|
||||
name='uploaded',
|
||||
field=models.CharField(default=0, help_text='原样输入,例:50GB,1.5TB', max_length=12, verbose_name='上 传'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 4.1.2 on 2023-01-07 22:55
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('pt_site', '0029_alter_userlevelrule_downloaded_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='userlevelrule',
|
||||
name='days',
|
||||
field=models.IntegerField(default=0, help_text='原样输入,单位:周', verbose_name='时 间'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userlevelrule',
|
||||
name='level',
|
||||
field=models.CharField(default='User', help_text='请去除空格', max_length=24, verbose_name='等 级'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userlevelrule',
|
||||
name='rights',
|
||||
field=models.TextField(help_text='当前等级所享有的权利与义务', max_length=256, verbose_name='权 利'),
|
||||
),
|
||||
]
|
||||
@@ -265,15 +265,15 @@ class Site(BaseEntity):
|
||||
class UserLevelRule(BaseEntity):
|
||||
site = models.ForeignKey(verbose_name='站 点', to=Site, on_delete=models.CASCADE)
|
||||
level_id = models.IntegerField(verbose_name='等级id', default=1)
|
||||
level = models.CharField(verbose_name='等 级', default='User', max_length=24)
|
||||
days = models.IntegerField(verbose_name='时 间', default=0, help_text='单位:天')
|
||||
uploaded = models.IntegerField(verbose_name='上 传', default=0, help_text='单位:GB')
|
||||
downloaded = models.IntegerField(verbose_name='下 载', default=0, help_text='单位:GB')
|
||||
level = models.CharField(verbose_name='等 级', default='User', max_length=24, help_text='请去除空格')
|
||||
days = models.IntegerField(verbose_name='时 间', default=0, help_text='原样输入,单位:周')
|
||||
uploaded = models.CharField(verbose_name='上 传', default=0, help_text='原样输入,例:50GB,1.5TB', max_length=12)
|
||||
downloaded = models.CharField(verbose_name='下 载', default=0, help_text='原样输入,例:50GB,1.5TB', max_length=12)
|
||||
bonus = models.IntegerField(verbose_name='魔 力', default=0)
|
||||
score = models.IntegerField(verbose_name='积 分', default=0)
|
||||
ratio = models.FloatField(verbose_name='分享率', default=0)
|
||||
torrents = models.IntegerField(verbose_name='发 种', default=0)
|
||||
rights = models.CharField(verbose_name='权 利', max_length=128,
|
||||
rights = models.TextField(verbose_name='权 利', max_length=256,
|
||||
help_text='当前等级所享有的权利与义务')
|
||||
|
||||
def __str__(self):
|
||||
|
||||
@@ -55,6 +55,18 @@
|
||||
height: 35px !important;
|
||||
}
|
||||
|
||||
.incomplete {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.complete {
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
th {
|
||||
width: 70px;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -248,7 +260,94 @@
|
||||
|
||||
</div>
|
||||
<span style="font-size: 10px;float: right;">
|
||||
<el-popover
|
||||
v-if="site.level_info"
|
||||
placement="top"
|
||||
width="440"
|
||||
trigger="hover">
|
||||
<table style="font-size: 10px;font-family: 'Heiti SC';margin-right: 5px;">
|
||||
<tr v-if="site.level_info">
|
||||
<th>当前等级:</th>
|
||||
<td class="complete"><span v-text="site.level_info.level"></span></td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level">
|
||||
<th>下一等级:</th>
|
||||
<td class="incomplete"><span v-text="site.next_level.level"></span></td>
|
||||
</tr>
|
||||
<tr v-if="site.upgrade_day">
|
||||
<th>升级时间:</th>
|
||||
<td><span v-text="site.upgrade_day.replace('T',' ')"
|
||||
class="incomplete"></span></td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level && site.next_level.uploaded > site.uploaded">
|
||||
<th>上传量:</th>
|
||||
<td><span v-text="renderSize(site.uploaded)"
|
||||
class="incomplete"></span> / <span
|
||||
v-text="renderSize(site.next_level.downloaded * site.next_level.ratio)">
|
||||
</span></td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level && site.next_level.downloaded > site.downloaded">
|
||||
<th>下载量:</th>
|
||||
<td><span v-text="renderSize(site.downloaded)" class="incomplete"></span> /
|
||||
<span v-text="renderSize(site.next_level.downloaded)"></span></td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level && site.next_level.bonus != 0 && site.next_level.bonus > site.sp">
|
||||
<th>魔力:</th>
|
||||
<td><span v-text="site.sp" class="incomplete"></span> / <span
|
||||
v-text="site.next_level.bonus"></span></td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level && site.next_level.score != 0 && site.next_level.score > site.bonus">
|
||||
<th>
|
||||
积分:
|
||||
</th>
|
||||
<td>
|
||||
<span v-text="site.bonus" class="incomplete"></span> / <span
|
||||
v-text="site.next_level.score"></span
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level && site.next_level.torrents != 0">
|
||||
<th>分享率:</th>
|
||||
<td><span v-text="site.level_info.ratio"
|
||||
class="incomplete"></span> / <span
|
||||
v-text="site.next_level.ratio"></span></td>
|
||||
</tr>
|
||||
<tr v-if="site.next_level && site.next_level.torrents != 0">
|
||||
<th>发种数:<th>
|
||||
<td><span v-text="site.level_info.torrents"
|
||||
class="incomplete"></span> / <span
|
||||
v-text="site.next_level.torrents"></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2" style="text-align: center"><h3>权益:</h3></th>
|
||||
</tr>
|
||||
<tr v-if="site.next_level">
|
||||
<th>即将拥有:
|
||||
</th>
|
||||
<td>
|
||||
<span class="incomplete"
|
||||
v-text="site.next_level.rights"></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>已拥有:</th>
|
||||
<td style="color: darkgreen;">
|
||||
<div v-if="site.next_level">
|
||||
<div v-for="value,index in site.level_info.rights">
|
||||
<i class="el-icon-star-on" v-text="`${index}:${value}`"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else="site.next_level">
|
||||
<i class="el-icon-star-on"
|
||||
v-text="site.level_info.rights"></i>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<i class="el-icon-user-solid" v-text="' ' + site.class" style="color: indianred"
|
||||
slot="reference"></i>
|
||||
</el-popover>
|
||||
<i class="el-icon-user-solid" v-text="' ' + site.class" style="color: indianred"
|
||||
v-else="site.level_info"
|
||||
title="用户等级"></i>
|
||||
<br v-if="site.hr == 0 && site.mail <= 0">
|
||||
<i class="el-icon-postcard" v-text="' ' + site.invite" style="color: #003366"
|
||||
@@ -625,6 +724,8 @@
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
showUserLever() {
|
||||
},
|
||||
getTorrent(id) {
|
||||
axios.get(
|
||||
"{% url 'get_site_torrents' %}" + `?id=${id}`
|
||||
|
||||
Reference in New Issue
Block a user