kopia lustrzana https://gitlab.com/marnanel/chapeau
172 wiersze
4.8 KiB
Python
172 wiersze
4.8 KiB
Python
from django.core.management.base import BaseCommand, CommandError
|
|
from django.conf import settings
|
|
from kepi.bowler_pub.models import *
|
|
from kepi.bowler_pub.create import create
|
|
from kepi.bowler_pub.management import KepiCommand, objects_by_keywords
|
|
from collections import abc
|
|
import os
|
|
import logging
|
|
|
|
logger = logging.Logger('kepi')
|
|
|
|
class Command(KepiCommand):
|
|
|
|
help = 'show users, statuses, and so on'
|
|
|
|
def add_arguments(self, parser):
|
|
|
|
super().add_arguments(parser)
|
|
|
|
parser.add_argument('id',
|
|
help='the object to show: @name for a user, or an '+\
|
|
'8-digit number',
|
|
metavar='OBJECT',
|
|
nargs='+',
|
|
)
|
|
|
|
parser.add_argument('--raw',
|
|
help='print the actual fields; don\'t try to interpret them',
|
|
action='store_true',
|
|
)
|
|
|
|
parser.add_argument('--json',
|
|
help='pretty-print the json that would be sent over the wire',
|
|
action='store_true',
|
|
)
|
|
|
|
################################
|
|
|
|
def _show_actor(self, somebody, *args, **options):
|
|
|
|
followers = Following.objects.filter(
|
|
following = somebody,
|
|
)
|
|
following = Following.objects.filter(
|
|
follower = somebody,
|
|
)
|
|
statuses = [x['object__obj'] for x in
|
|
AcCreate.objects.filter(
|
|
f_actor = somebody.short_id,
|
|
)]
|
|
|
|
result = [
|
|
('url', somebody.url),
|
|
('bio', somebody.f_summary),
|
|
('auto-follow', somebody.auto_follow),
|
|
('followers', followers),
|
|
('following', following),
|
|
('statuses', statuses),
|
|
]
|
|
|
|
self._display_table(result,
|
|
title=somebody.id,
|
|
)
|
|
|
|
def _show_activity(self, activity, *args, **options):
|
|
|
|
result = [
|
|
('type', activity.f_type),
|
|
('actor', activity['actor']),
|
|
('object', activity['object']),
|
|
('target', activity['target']),
|
|
]
|
|
|
|
self._display_table(result,
|
|
title='activity %s' % (activity.number,),
|
|
)
|
|
|
|
def _show_item(self, item, *args, **options):
|
|
|
|
# XXX date etc
|
|
# XXX find activity which created it
|
|
|
|
result = [
|
|
('by', item['attributedTo']),
|
|
('date', item['published']),
|
|
('content', item['content']),
|
|
('visibility', item.visibility),
|
|
]
|
|
|
|
if item.is_reply:
|
|
result.append(('reply_to', item['replyTo']))
|
|
|
|
self._display_table(result,
|
|
title='item %s' % (item.number,),
|
|
)
|
|
|
|
def _display_table(self, items,
|
|
title=None):
|
|
|
|
if title:
|
|
print('== %s ==' % (title,))
|
|
|
|
width = max([len(f) for f,v in items])
|
|
|
|
for f,v in items:
|
|
print('%*s: ' % (
|
|
width,
|
|
f,
|
|
),
|
|
end='')
|
|
|
|
if isinstance(v, str):
|
|
print(v)
|
|
elif isinstance(v, abc.Iterable):
|
|
|
|
print(len(v))
|
|
|
|
spaces = (' '*width)+' '
|
|
|
|
for line in v:
|
|
print(spaces+str(line))
|
|
else:
|
|
print(v)
|
|
|
|
def _show_raw_object(self, thing, *args, **options):
|
|
self._display_table(
|
|
sorted(thing.activity_form.items()))
|
|
|
|
def _show_json(self, thing, *args, **options):
|
|
|
|
from kepi.bowler_pub.utils import as_json
|
|
|
|
print(as_json(thing.activity_form))
|
|
|
|
################################
|
|
|
|
def _show_thing(self, thing, *args, **options):
|
|
|
|
if options['raw']:
|
|
self._show_raw_object(thing, *args, **options)
|
|
elif options['json']:
|
|
self._show_json(thing, *args, **options)
|
|
elif isinstance(thing, AcActor):
|
|
self._show_actor(thing, *args, **options)
|
|
elif isinstance(thing, AcActivity):
|
|
self._show_activity(thing, *args, **options)
|
|
elif isinstance(thing, AcItem):
|
|
self._show_item(thing, *args, **options)
|
|
else:
|
|
self._show_raw_object(thing, *args, **options)
|
|
|
|
################################
|
|
|
|
def handle(self, *args, **options):
|
|
|
|
super().handle(*args, **options)
|
|
|
|
logger.debug('Showing: %s', options['id'])
|
|
|
|
try:
|
|
things = objects_by_keywords(options['id'])
|
|
logger.debug(' -- which are: %s', things)
|
|
|
|
for thing in things:
|
|
self._show_thing(thing, *args, **options)
|
|
except KeyError as ke:
|
|
logger.debug(' -- which don\'t all exist: %s',
|
|
ke.args[0])
|
|
self.stdout.write(self.style.WARNING(
|
|
ke.args[0],))
|
|
|