show user count in main instance list
This commit is contained in:
parent
6d05ceadba
commit
955ad4d0cf
|
@ -1,4 +1,5 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from collections import OrderedDict
|
||||||
from scraper.models import Instance, InstanceStats
|
from scraper.models import Instance, InstanceStats
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,7 +12,15 @@ class InstanceStatsSerializer(serializers.ModelSerializer):
|
||||||
class InstanceListSerializer(serializers.ModelSerializer):
|
class InstanceListSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Instance
|
model = Instance
|
||||||
fields = ('name', )
|
fields = ('name', 'user_count')
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
"""
|
||||||
|
Object instance -> Dict of primitive datatypes.
|
||||||
|
"""
|
||||||
|
ret = super(InstanceListSerializer, self).to_representation(instance)
|
||||||
|
ret = OrderedDict(list(filter(lambda x: x[1], ret.items())))
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
class InstanceDetailSerializer(serializers.ModelSerializer):
|
class InstanceDetailSerializer(serializers.ModelSerializer):
|
||||||
|
|
|
@ -26,7 +26,7 @@ from scraper.management.commands._util import require_lock, InvalidResponseError
|
||||||
|
|
||||||
# TODO: use the /api/v1/server/followers and /api/v1/server/following endpoints in peertube instances
|
# TODO: use the /api/v1/server/followers and /api/v1/server/following endpoints in peertube instances
|
||||||
|
|
||||||
SEED = 'geekly.social'
|
SEED = 'mastodon.social'
|
||||||
TIMEOUT = 20
|
TIMEOUT = 20
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,14 +76,21 @@ class Command(BaseCommand):
|
||||||
@require_lock(Instance, 'ACCESS EXCLUSIVE')
|
@require_lock(Instance, 'ACCESS EXCLUSIVE')
|
||||||
def save_data(self, data):
|
def save_data(self, data):
|
||||||
"""Save data"""
|
"""Save data"""
|
||||||
|
user_count = get_key(data, ['info', 'stats', 'user_count'])
|
||||||
|
if user_count:
|
||||||
|
instance, _ = Instance.objects.update_or_create(
|
||||||
|
name=get_key(data, ['instance']),
|
||||||
|
defaults={'user_count': user_count},
|
||||||
|
)
|
||||||
|
else:
|
||||||
instance, _ = Instance.objects.get_or_create(name=get_key(data, ['instance']))
|
instance, _ = Instance.objects.get_or_create(name=get_key(data, ['instance']))
|
||||||
if data['status'] == 'success':
|
if data['status'] == 'success':
|
||||||
# Save stats
|
# Save stats
|
||||||
stats = InstanceStats(
|
stats = InstanceStats(
|
||||||
instance=instance,
|
instance=instance,
|
||||||
num_peers=get_key(data, ['info', 'stats', 'domain_count']),
|
domain_count=get_key(data, ['info', 'stats', 'domain_count']),
|
||||||
num_statuses=get_key(data, ['info', 'stats', 'status_count']),
|
status_count=get_key(data, ['info', 'stats', 'status_count']),
|
||||||
num_users=get_key(data, ['info', 'stats', 'user_count']),
|
user_count=get_key(data, ['info', 'stats', 'user_count']),
|
||||||
version=get_key(data, ['info', 'version']),
|
version=get_key(data, ['info', 'version']),
|
||||||
status=get_key(data, ['status']),
|
status=get_key(data, ['status']),
|
||||||
)
|
)
|
||||||
|
|
33
scraper/migrations/0003_auto_20180828_2206.py
Normal file
33
scraper/migrations/0003_auto_20180828_2206.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# Generated by Django 2.1 on 2018-08-28 22:06
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('scraper', '0002_auto_20180826_2201'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='instancestats',
|
||||||
|
old_name='num_peers',
|
||||||
|
new_name='domain_count',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='instancestats',
|
||||||
|
old_name='num_statuses',
|
||||||
|
new_name='status_count',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='instancestats',
|
||||||
|
old_name='num_users',
|
||||||
|
new_name='user_count',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='instance',
|
||||||
|
name='user_count',
|
||||||
|
field=models.IntegerField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
|
@ -4,17 +4,19 @@ from django.db import models
|
||||||
class Instance(models.Model):
|
class Instance(models.Model):
|
||||||
name = models.CharField(max_length=200, primary_key=True)
|
name = models.CharField(max_length=200, primary_key=True)
|
||||||
peers = models.ManyToManyField('self', symmetrical=False)
|
peers = models.ManyToManyField('self', symmetrical=False)
|
||||||
|
user_count = models.IntegerField(blank=True, null=True)
|
||||||
|
|
||||||
|
|
||||||
class InstanceStats(models.Model):
|
class InstanceStats(models.Model):
|
||||||
|
# TODO: collect everything the API exposes
|
||||||
timestamp = models.DateTimeField(auto_now_add=True)
|
timestamp = models.DateTimeField(auto_now_add=True)
|
||||||
instance = models.ForeignKey(
|
instance = models.ForeignKey(
|
||||||
Instance,
|
Instance,
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='stats',
|
related_name='stats',
|
||||||
)
|
)
|
||||||
num_peers = models.IntegerField(blank=True, null=True)
|
domain_count = models.IntegerField(blank=True, null=True)
|
||||||
num_statuses = models.IntegerField(blank=True, null=True)
|
status_count = models.IntegerField(blank=True, null=True)
|
||||||
num_users = models.IntegerField(blank=True, null=True)
|
user_count = models.IntegerField(blank=True, null=True)
|
||||||
version = models.CharField(max_length=1000, blank=True)
|
version = models.CharField(max_length=1000, blank=True)
|
||||||
status = models.CharField(max_length=100)
|
status = models.CharField(max_length=100)
|
||||||
|
|
Loading…
Reference in a new issue