@@ -50,6 +50,10 @@ class RemoteActor(models.Model):
5050 help_text = "A field to track when remote actor are updated" ,
5151 )
5252
53+ @property
54+ def safe_url (self ):
55+ return f"{ self .url .rstrip ('/' )} /"
56+
5357
5458class Actor (models .Model ):
5559 """
@@ -227,6 +231,11 @@ def reputation_value(self):
227231 def absolute_url (self ):
228232 return full_reverse ("note-page" , self .id )
229233
234+ @property
235+ def acct_avatar (self ):
236+ person = Person .objects .get (user__username = self .username )
237+ return person .avatar
238+
230239 @property
231240 def to_ap (self ):
232241 return {
@@ -290,6 +299,10 @@ def __str__(self):
290299 def followers_count (self ):
291300 return Follow .objects .filter (package = self ).count ()
292301
302+ @property
303+ def notes_count (self ):
304+ return Note .objects .filter (acct = self .acct ).count ()
305+
293306 @property
294307 def followers (self ):
295308 return Follow .objects .filter (package = self ).values ("person_id" )
@@ -350,16 +363,9 @@ def to_ap(self):
350363
351364class Person (Actor ):
352365 """
353- A person is a user can follow pacakge or just vote or create a notes
366+ A person is a user can follow package or just vote or create a notes
354367 """
355368
356- avatar = models .ImageField (
357- upload_to = "uploads/" ,
358- help_text = "" ,
359- default = "favicon-16x16.png" ,
360- null = True ,
361- )
362-
363369 user = models .OneToOneField (
364370 User ,
365371 null = True ,
@@ -391,13 +397,24 @@ class Meta:
391397 ),
392398 ]
393399
400+ @property
401+ def avatar (self ):
402+ from hashlib import sha256
403+
404+ email = ""
405+ if self .user and (email := self .user .email ):
406+ email = email .strip ().lower ()
407+
408+ gravatar = sha256 (email .encode ("utf-8" )).hexdigest ()
409+ return f"https://gravatar.com/avatar/{ gravatar } "
410+
394411 @property
395412 def local (self ):
396413 return bool (self .user )
397414
398415 @property
399416 def avatar_absolute_url (self ):
400- return f' { "https://" } { FEDERATEDCODE_DOMAIN } { self .avatar . url } '
417+ return self .avatar
401418
402419 # TODO raise error if the user doesn't have a user or remote actor
403420 @property
@@ -425,13 +442,13 @@ def absolute_url_ap(self):
425442 @property
426443 def inbox_url (self ):
427444 if not self .local :
428- return urljoin (self .remote_actor .url , "inbox" )
445+ return urljoin (self .remote_actor .safe_url , "inbox" )
429446 return full_reverse ("user-inbox" , self .user .username )
430447
431448 @property
432449 def outbox_url (self ):
433450 if not self .local :
434- return urljoin (self .remote_actor .url , "outbox" )
451+ return urljoin (self .remote_actor .safe_url , "outbox" )
435452 return full_reverse ("user-outbox" , self .user .username )
436453
437454 @property
@@ -443,7 +460,7 @@ def key_id(self):
443460 if self .user :
444461 return full_reverse ("user-ap-profile" , self .user .username ) + "#main-key"
445462 else :
446- return self .remote_actor .url + "#main-key"
463+ return self .remote_actor .safe_url + "#main-key"
447464
448465 @property
449466 def to_ap (self ):
@@ -604,7 +621,7 @@ class Vulnerability(models.Model):
604621 )
605622
606623 class Meta :
607- unique_together = ('id' , ' repo' )
624+ unique_together = ("id" , " repo" )
608625
609626 @property
610627 def absolute_url (self ):
0 commit comments