Philipp Hörist pushed to branch master at gajim / gajim

Commits:

3 changed files:

Changes:

  • .gitignore
    ... ... @@ -33,3 +33,4 @@ node_modules/
    33 33
     .vscode
    
    34 34
     *.sublime-project
    
    35 35
     *.sublime-workspace
    
    36
    +.idea

  • gajim/common/helpers.py
    ... ... @@ -248,29 +248,36 @@ def get_uf_affiliation(affiliation: Union[Affiliation, str],
    248 248
         return ''
    
    249 249
     
    
    250 250
     
    
    251
    -def get_uf_relative_time(timestamp: float) -> str:
    
    251
    +def get_uf_relative_time(timestamp: float,
    
    252
    +                         timenow: Optional[float] = None) -> str:
    
    252 253
         date_time = datetime.fromtimestamp(timestamp)
    
    253
    -    now = datetime.now()
    
    254
    +    if timenow:  # used by unittest
    
    255
    +        now = datetime.fromtimestamp(timenow)
    
    256
    +    else:
    
    257
    +        now = datetime.now()
    
    254 258
         timespan = now - date_time
    
    255 259
     
    
    256
    -    if timespan > timedelta(days=365):
    
    257
    -        return str(date_time.year)
    
    258
    -    if timespan > timedelta(days=7):
    
    259
    -        return date_time.strftime('%b %d')
    
    260
    -    if timespan > timedelta(days=2):
    
    261
    -        return date_time.strftime('%a')
    
    262
    -    if date_time.strftime('%d') != now.strftime('%d'):
    
    263
    -        return _('Yesterday')
    
    264
    -    if timespan > timedelta(minutes=15):
    
    265
    -        return date_time.strftime('%H:%M')
    
    266
    -    if timespan > timedelta(minutes=1):
    
    260
    +    if timespan < timedelta(minutes=1):
    
    261
    +        return _('Just now')
    
    262
    +    if timespan < timedelta(minutes=15):
    
    267 263
             minutes = int(timespan.seconds / 60)
    
    268 264
             return ngettext('%i min ago',
    
    269 265
                             '%i mins ago',
    
    270 266
                             minutes,
    
    271 267
                             minutes,
    
    272 268
                             minutes)
    
    273
    -    return _('Just now')
    
    269
    +    today = now.date()
    
    270
    +    if date_time.date() == today:
    
    271
    +        format_string = app.settings.get('time_format')
    
    272
    +        return date_time.strftime(format_string)
    
    273
    +    yesterday = now.date() - timedelta(days=1)
    
    274
    +    if date_time.date() == yesterday:
    
    275
    +        return _('Yesterday')
    
    276
    +    if timespan < timedelta(days=7):  # this week
    
    277
    +        return date_time.strftime('%a')  # weekday
    
    278
    +    if timespan < timedelta(days=365):  # this year
    
    279
    +        return date_time.strftime('%b %d')
    
    280
    +    return str(date_time.year)
    
    274 281
     
    
    275 282
     
    
    276 283
     def to_one_line(msg: str) -> str:
    

  • test/common/test_get_uf_relative_time.py
    1
    +
    
    2
    +import unittest
    
    3
    +from datetime import datetime
    
    4
    +from datetime import timedelta
    
    5
    +from datetime import timezone
    
    6
    +
    
    7
    +from gajim.common import app
    
    8
    +from gajim.common.helpers import get_uf_relative_time
    
    9
    +from gajim.common.settings import Settings
    
    10
    +
    
    11
    +app.settings = Settings(in_memory=True)
    
    12
    +
    
    13
    +
    
    14
    +class GetRelativeTimeTest(unittest.TestCase):
    
    15
    +    '''Tests for the get_uf_relative_time function.'''
    
    16
    +
    
    17
    +    def test_sub_1_minute(self):
    
    18
    +        '''Test timedelta less than 1 minute'''
    
    19
    +        timenow = datetime(2023, 1, 2, 3, 4, 0, tzinfo=timezone.utc)
    
    20
    +        timestamp1 = timenow - timedelta(seconds=30)
    
    21
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    22
    +                                              timenow.timestamp()), 'Just now')
    
    23
    +
    
    24
    +    def test_sub_15_minutes(self):
    
    25
    +        '''Test timedelta less than 15 minutes and more than 1 minute ago'''
    
    26
    +        timenow = datetime(2023, 1, 2, 3, 4, 0, tzinfo=timezone.utc)
    
    27
    +        timestamp1 = timenow - timedelta(minutes=3)
    
    28
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    29
    +                                              timenow.timestamp()),
    
    30
    +                         '3 mins ago')
    
    31
    +
    
    32
    +    def test_sub_15_minutes_next_day(self):
    
    33
    +        '''Test timedelta less than 15 minutes and it is the next day'''
    
    34
    +        timenow = datetime(2023, 1, 1, 0, 5, 0, tzinfo=timezone.utc)
    
    35
    +        timestamp1 = timenow - timedelta(minutes=10)
    
    36
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    37
    +                                              timenow.timestamp()),
    
    38
    +                         '10 mins ago')
    
    39
    +
    
    40
    +    def test_today(self):
    
    41
    +        '''Test today: same day and more than 15 minutes ago'''
    
    42
    +        timenow = datetime(2023, 1, 2, 12, 0, 0, tzinfo=timezone.utc)
    
    43
    +        timestamp1 = timenow - timedelta(hours=4)
    
    44
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    45
    +                                              timenow.timestamp()),
    
    46
    +                         timestamp1.strftime(app.settings.get('time_format')))
    
    47
    +
    
    48
    +    def test_yesterday_less_than_24h(self):
    
    49
    +        '''Test yesterday and less than 24h ago'''
    
    50
    +        timenow = datetime(2023, 1, 2, 12, 0, 0, tzinfo=timezone.utc)
    
    51
    +        timestamp1 = datetime(2023, 1, 1, 14, 0, 0, tzinfo=timezone.utc)
    
    52
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    53
    +                                              timenow.timestamp()), 'Yesterday')
    
    54
    +
    
    55
    +    def test_yesterday_more_than_24h(self):
    
    56
    +        '''Test yesterday and more than 24h ago'''
    
    57
    +        timenow = datetime(2023, 1, 2, 12, 0, 0, tzinfo=timezone.utc)
    
    58
    +        timestamp1 = datetime(2023, 1, 1, 10, 0, 0, tzinfo=timezone.utc)
    
    59
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    60
    +                                              timenow.timestamp()),
    
    61
    +                         'Yesterday')
    
    62
    +
    
    63
    +    def test_weekday(self):
    
    64
    +        '''Test weekday: timestamp older than yesterday and less
    
    65
    +        than 7 days ago, should return the weekday, i.e. 'Sun' for Sunday'''
    
    66
    +        timenow = datetime(2023, 1, 5, 1, 2, 3, tzinfo=timezone.utc)
    
    67
    +        timestamp1 = datetime(2023, 1, 1, 4, 5, 6, tzinfo=timezone.utc)
    
    68
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    69
    +                                              timenow.timestamp()),
    
    70
    +                         timestamp1.strftime('%a'))
    
    71
    +
    
    72
    +    def test_month_day(self):
    
    73
    +        '''Test month_day: timestamp more than 7 days ago but less than 365'''
    
    74
    +        timenow = datetime(2023, 1, 5, 1, 2, 3, tzinfo=timezone.utc)
    
    75
    +        timestamp1 = datetime(2022, 11, 15, 4, 5, 6, tzinfo=timezone.utc)
    
    76
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    77
    +                                              timenow.timestamp()),
    
    78
    +                         timestamp1.strftime('%b %d'))
    
    79
    +
    
    80
    +    def test_year(self):
    
    81
    +        '''Test year: timestamp more than 365 days ago'''
    
    82
    +        timenow = datetime(2023, 1, 5, 1, 2, 3, tzinfo=timezone.utc)
    
    83
    +        timestamp1 = datetime(2022, 1, 1, 4, 5, 6, tzinfo=timezone.utc)
    
    84
    +        self.assertEqual(get_uf_relative_time(timestamp1.timestamp(),
    
    85
    +                                              timenow.timestamp()), '2022')
    
    86
    +
    
    87
    +
    
    88
    +if __name__ == '__main__':
    
    89
    +    unittest.main()