Changeset 499
- Timestamp:
- 07/10/08 14:37:01 (6 months ago)
- Files:
-
- trunk/djedna/catalog2/forms.py (modified) (1 diff)
- trunk/djedna/catalog2/models.py (modified) (13 diffs)
- trunk/djedna/catalog2/tests.py (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/djedna/catalog2/forms.py
r498 r499 93 93 'title', 'slug', 'number', 'length', 'year', 'artist', 94 94 'new_artist_name', 'album', 'new_album_title', 'trackfiles', 95 'image_override', 'publish', 'expire', ' is_active'95 'image_override', 'publish', 'expire', 'active' 96 96 ] 97 97 trunk/djedna/catalog2/models.py
r498 r499 24 24 import time 25 25 import wave 26 import zipfile 26 27 27 28 from django.conf import settings … … 105 106 return published_q & not_expired_q 106 107 107 def get_unpublished_q(self, now=None):108 if not now:109 now = datetime.datetime.now()110 published_q = self.get_published_q(now=now)111 return ~published_q112 113 108 def get_active_q(self, now=None): 114 if not now: 115 now = datetime.datetime.now() 116 return models.Q(is_active=True) & self.get_published_q(now=now) 117 118 def get_inactive_q(self, now=None): 119 if not now: 120 now = datetime.datetime.now() 121 return models.Q(is_active=False) | self.get_unpublished_q(now=now) 122 123 def get_active_query_set(self, now=None): 124 if not now: 125 now = datetime.datetime.now() 126 return self.get_query_set().filter(self.get_active_q(now=now)) 127 active = property(get_active_query_set) 128 129 def get_inactive_query_set(self, now=None): 130 if not now: 131 now = datetime.datetime.now() 132 return self.get_query_set().filter(self.get_inactive_q(now=now)) 133 inactive = property(get_inactive_query_set) 109 return models.Q(active=True) & self.get_published_q(now=now) 134 110 135 111 def get_site_q(self, site_id=None): … … 138 114 return models.Q(sites__id__exact=site_id) 139 115 116 def get_active_site_q(self, now=None, site_id=None): 117 return self.get_active_q(now=now) & self.get_site_q(site_id=site_id) 118 119 def get_active_query_set(self, now=None): 120 return self.get_query_set().filter(self.get_active_q(now=now)) 121 active = property(get_active_query_set) 122 123 def get_inactive_query_set(self, now=None): 124 return self.get_query_set().exclude(self.get_active_q(now=now)) 125 inactive = property(get_inactive_query_set) 126 140 127 def get_site_query_set(self, site_id=None): 141 if site_id == None:142 site_id = settings.SITE_ID143 128 return self.get_query_set().filter(self.get_site_q(site_id=site_id)) 144 129 on_site = property(get_site_query_set) 145 130 146 def get_active_site_q(self, now=None, site_id=None):147 if not now:148 now = datetime.datetime.now()149 if site_id == None:150 site_id = settings.SITE_ID151 return self.get_active_q(now=now) & self.get_site_q(site_id=site_id)152 153 def get_inactive_site_q(self, now=None, site_id=None):154 if not now:155 now = datetime.datetime.now()156 if site_id == None:157 site_id = settings.SITE_ID158 return self.get_inactive_q(now=now) & self.get_site_q(site_id=site_id)159 160 131 def get_active_site_query_set(self, now=None, site_id=None): 161 if not now:162 now = datetime.datetime.now()163 if site_id == None:164 site_id = settings.SITE_ID165 132 return self.get_query_set().filter( 166 133 self.get_active_site_q(now=now, site_id=site_id) … … 169 136 170 137 def get_inactive_site_query_set(self, now=None, site_id=None): 171 if not now: 172 now = datetime.datetime.now() 173 if site_id == None: 174 site_id = settings.SITE_ID 175 return self.get_query_set().filter( 176 self.get_inactive_site_q(now=now, site_id=site_id) 138 return self.get_query_set().exclude( 139 self.get_active_site_q(now=now, site_id=site_id) 177 140 ) 178 141 inactive_on_site = property(get_inactive_site_query_set) 142 179 143 180 144 class Publishable(models.Model): 181 is_active = models.BooleanField(default=True, blank=True)145 active = models.BooleanField(default=True, blank=True) 182 146 publish = models.DateTimeField(null=True, blank=True) 183 147 expire = models.DateTimeField(null=True, blank=True) … … 188 152 class Meta: 189 153 abstract = True 154 155 def is_active(self, now=None): 156 active = self.active 157 if active: 158 if not now: 159 now = datetime.datetime.now() 160 published = True 161 if self.publish and self.publish > now: 162 published = False 163 if published and self.expire and self.expire < now: 164 published = False 165 active = published 166 return active 190 167 191 168 … … 291 268 def update(self, group_hash=None, force_update=False): 292 269 needs_update = force_update 293 if self. is_active and not self.file_exists():270 if self.active and not self.file_exists(): 294 271 needs_update = True 295 272 file_modified = self._get_file_modified_datetime() … … 308 285 self.mimetype = self.file_mimetype or '' 309 286 if not self.file_exists(): 310 self. is_active = False287 self.active = False 311 288 super(MediaFile, self).save() 312 289 if create and not self.sites.count(): … … 788 765 self.relative_path, requested_size 789 766 ) 790 relative_path = thumbnail.relative_dest791 767 imagefile, created = \ 792 768 ImageFile.objects.get_or_create_from_path( 793 relative_path,769 thumbnail.relative_dest, 794 770 master=self, 795 771 sites=self.sites.all() … … 865 841 sender=ImageFileUpload 866 842 ) 843 844 845 class ArchiveFile(MediaFile): 846 trackfiles = models.ManyToManyField(TrackFile) 847 imagefiles = models.ManyToManyField(ImageFile) 848 849 def get_absolute_url(self): 850 return reverse( 851 'djedna_downloadfile_detail', 852 kwargs={'downloadfile_id' : self.id} 853 ) 854 855 def get_models(self): 856 tracks = [] 857 artists = [] 858 albums = [] 859 for trackfile in self.trackfiles.all(): 860 track = trackfile.track 861 artist = trackfile.track.artist 862 album = trackfile.track.album 863 if track and track not in tracks: 864 tracks.append(track) 865 if artist and artist not in artists: 866 artists.append(artist) 867 if album and album not in albums: 868 albums.append(album) 869 return tracks, albums, artists 870 trackfiles = self.trackfiles.filter(TrackFile.objects.get_active_q()) 871 tracks = Track.objects.filter( 872 id__in=[trackfile.track.id for trackfile in trackfiles] 873 ) 874 875 def remove_archive(self): 876 if self.file_exists(): 877 mediaserver.remove_media(self.relative_path) 878 879 def generate_archive(self): 880 self.remove_archive() 881 archive = None 882 try: 883 archive = zipfile.ZipFile(self.path, mode='w') 884 for imagefile in self.imagefiles.all(): 885 arcname = smart_str( 886 os.path.join(u'images', imagefile.filename), 887 errors='ignore' 888 ) 889 archive.write(imagefile.path, arcname=arcname) 890 tracks, albums, artists = self.get_models() 891 for trackfile in self.trackfiles.all(): 892 track = trackfile.track 893 filename = u"%s" % track.number 894 if len(albums) > 1 and track.album: 895 filename = "%s-%s" % (filename, track.album.slug) 896 if len(artists) > 1: 897 filename = "%s-%s" % (filename, track.artist.slug) 898 arcname = smart_str( 899 os.path.join( 900 u'tracks', '%s-%s' % (filename, trackfile.filename) 901 ), 902 errors='ignore' 903 ) 904 archive.write(trackfile.path, arcname=arcname) 905 finally: 906 if archive: 907 archive.close() 908 909 def get_media_url(self, user=None, query_auth=None, expires_in=None): 910 if not self.file_exists(): 911 self.generate_archive() 912 return super(DownloadFile, self).get_media_url( 913 user=user, query_auth=query_auth, expires_in=expires_in 914 ) 915 867 916 868 917 … … 904 953 album.add_artist(artist) 905 954 return (track, track_created) 955 956 def get_active_q(self, now=None): 957 if not now: 958 now = datetime.datetime.now() 959 super_active_q = super(TrackManager, self).get_active_q(now=now) 960 artist_published_q = \ 961 models.Q(artist__publish__isnull=True) | \ 962 models.Q(artist__publish__lte=now) 963 artist_not_expired_q = \ 964 models.Q(artist__expire__isnull=True) | \ 965 models.Q(artist__expire__gte=now) 966 artist_active_q = \ 967 models.Q(artist__active=True) & \ 968 artist_published_q & \ 969 artist_not_expired_q 970 album_published_q = \ 971 models.Q(album=None) | \ 972 models.Q(album__publish__isnull=True) | \ 973 models.Q(album__publish__lte=now) 974 album_not_expired_q = \ 975 models.Q(album=None) | \ 976 models.Q(album__expire__isnull=True) | \ 977 models.Q(album__expire__gte=now) 978 album_active_q = \ 979 (models.Q(album=None) | models.Q(album__active=True)) & \ 980 album_published_q & \ 981 album_not_expired_q 982 return super_active_q & artist_active_q & album_active_q 906 983 907 984 … … 968 1045 calculated_slug = property(_get_calculated_slug) 969 1046 1047 def is_active(self, now=None): 1048 active = super(Track, self).is_active(now=now) 1049 if active: 1050 active = self.artist.is_active(now=now) 1051 if active and self.album: 1052 active = self.album.is_active(now=now) 1053 return active 1054 970 1055 def update(self): 971 1056 needs_update = False … … 989 1074 class AlbumManager(PublishableManager): 990 1075 pass 991 1076 # def get_artists_active_q(self, now=None): 1077 # if not now: 1078 # now = datetime.datetime.now() 1079 # artists_active_q = \ 1080 # models.Q( 1081 # artists__active=True, 1082 # artists__publish__isnull=True, 1083 # artists__expire__isnull=True 1084 # ) | \ 1085 # models.Q( 1086 # artists__active=True, 1087 # artists__publish__lte=now, 1088 # artists__expire__isnull=True 1089 # ) | \ 1090 # models.Q( 1091 # artists__active=True, 1092 # artists__publish__isnull=True, 1093 # artists__expire__gte=now 1094 # ) | \ 1095 # models.Q( 1096 # artists__active=True, 1097 # artists__publish__lte=now, 1098 # artists__expire__gte=now 1099 # ) 1100 # return artists_active_q 1101 # 1102 # def get_active_query_set(self, now=None): 1103 # super_query_set = \ 1104 # super(AlbumManager, self).get_active_query_set(now=now) 1105 # return super_query_set.filter(self.get_artists_active_q(now=now)).distinct() 1106 # active = property(get_active_query_set) 1107 # 1108 # def get_inactive_query_set(self, now=None): 1109 # super_query_set = \ 1110 # super(AlbumManager, self).get_inactive_query_set(now=now).distinct() 1111 # active_query_set = self.get_query_set().filter(self.get_artists_active_q(now=now)).distinct() 1112 # inactive_query_set = self.get_query_set().exclude(self.get_artists_active_q(now=now)).distinct() 1113 # for album in self.get_query_set(): 1114 # log.info("ALL: %s" % album) 1115 # for album in super_query_set: 1116 # log.info("SUPER: %s" % album) 1117 # for album in active_query_set: 1118 # log.info("ACTIVE ARTISTS: %s" % album) 1119 # for album in inactive_query_set: 1120 # log.info("INACTIVE ARTISTS: %s" % album) 1121 # return super_query_set | inactive_query_set 1122 # inactive = property(get_inactive_query_set) 1123 # 1124 # def get_active_site_query_set(self, now=None, site_id=None): 1125 # super_query_set = \ 1126 # super(AlbumManager, self).get_active_site_query_set( 1127 # now=now, site_id=site_id 1128 # ) 1129 # return super_query_set.distinct() 1130 # active_on_site = property(get_active_site_query_set) 1131 # 1132 # def get_inactive_site_query_set(self, now=None, site_id=None): 1133 # super_query_set = \ 1134 # super(AlbumManager, self).get_inactive_site_query_set( 1135 # now=now, site_id=site_id 1136 # ) 1137 # return super_query_set.distinct() 1138 # inactive_on_site = property(get_inactive_site_query_set) 1139 # 1140 # 992 1141 class AlbumCurrentSiteManager(CurrentSiteManager, AlbumManager): 993 1142 pass … … 1080 1229 self.update() 1081 1230 1231 # def is_active(self, now=None): 1232 # active = super(Album, self).is_active(now=now) 1233 # if active: 1234 # for artist in self.artists.all(): 1235 # active = artist.is_active(now=now) 1236 # if active: 1237 # break 1238 # return active 1239 # 1082 1240 def update(self): 1083 1241 needs_update = False trunk/djedna/catalog2/tests.py
r498 r499 250 250 ) 251 251 self.failUnless(trackfile) 252 self.failUnless(trackfile.is_active) 252 self.failUnless(trackfile.active) 253 self.failUnless(trackfile.is_active()) 253 254 self.failUnlessEqual(trackfile.mimetype, 'audio/mpeg') 254 255 self.failUnlessEqual(trackfile.path, FILE1_MP3) … … 305 306 self.failUnlessEqual(track.year, u'2007') 306 307 self.failUnlessEqual(track.length, 23) 307 self.failUnless(track.is_active) 308 self.failUnless(track.active) 309 self.failUnless(track.is_active()) 308 310 self.failUnlessEqual(track.image, trackfile.image) 309 311 # Album … … 320 322 album.latest_track_modified_on_site, track.updated 321 323 ) 322 self.failUnless(album.is_active) 324 self.failUnless(album.active) 325 self.failUnless(album.is_active()) 323 326 self.failUnlessEqual(album.image, trackfile.image) 324 327 # Artist … … 326 329 self.failUnlessEqual(artist.name, u'Artist One') 327 330 self.failUnlessEqual(artist.latest_track_modified, track.updated) 328 self.failUnless(album.is_active) 331 self.failUnless(album.active) 332 self.failUnless(album.is_active()) 329 333 self.failUnlessEqual(artist.sort_name, u'artist one') 330 334 self.failUnlessEqual(artist.track_count, 1) … … 340 344 artist.latest_album_modified_on_site, album.updated 341 345 ) 342 self.failUnless(artist.is_active) 346 self.failUnless(artist.active) 347 self.failUnless(artist.is_active()) 343 348 self.failUnlessEqual(artist.image, trackfile.image) 344 349 … … 421 426 trackfile, created = TrackFile.objects.get_or_create_from_path(relative_path) 422 427 self.failUnless(trackfile) 423 self.failIf(trackfile.is_active) 428 self.failIf(trackfile.active) 429 self.failIf(trackfile.is_active()) 424 430 self.failUnless(created) 425 431 self.failUnlessEqual(trackfile.relative_dirpath, BOGUS_ALBUM_REL) … … 453 459 TrackFile.objects.get, 454 460 relative_path=relative_path, 455 is_active=True)461 active=True) 456 462 457 463 def test_get_in_path(self): … … 487 493 trackfiles = TrackFile.objects.filter( 488 494 group_hash=group_hash, 489 is_active=True495 active=True 490 496 ) 491 497 self.failUnlessEqual( … … 515 521 self.failUnlessEqual(trackfile, trackfiles[0]) 516 522 trackfile = trackfiles[0] 517 self.failIf(trackfile.is_active) 523 self.failIf(trackfile.active) 524 self.failIf(trackfile.is_active()) 518 525 # Touch a file 519 526 trackfiles = TrackFile.objects.filter( 520 is_active=True527 active=True 521 528 ) 522 529 trackfile = trackfiles[0] … … 567 574 self.failUnlessEqual(track.year, u'2007') 568 575 self.failUnlessEqual(track.length, 23) 569 self.failUnless(track.is_active) 576 self.failUnless(track.active) 577 self.failUnless(track.is_active()) 570 578 # Try to add the previous file again 571 579 group_hash = TrackFile.objects.add_from_path(FILE1_MP3_REL) … … 595 603 self.failUnless(added_track) 596 604 self.failUnless(added_artist) 597 self.failUnless(added_track.is_active) 605 self.failUnless(added_track.active) 606 self.failUnless(added_track.is_active()) 598 607 self.failUnless(added_image) 599 608 self.failUnlessEqual(added_artist, artist) … … 1125 1134 Artist.objects.get_or_create(name='Artist One* ') 1126 1135 artist, created = Artist.objects.get_or_create(name='Inactive Artist') 1127 artist. is_active = False1136 artist.active = False 1128 1137 artist.save() 1129 1138 … … 1203 1212 album.add_artist(artist1) 1204 1213 album.add_artist(artist2) 1214 album, created = Album.objects.get_or_create(title='Album Two') 1215 album.add_artist(artist2) 1205 1216 album, created = Album.objects.get_or_create(title='Inactive Album') 1206 album. is_active = False1217 album.active = False 1207 1218 album.save() 1208 1219 … … 1211 1222 1212 1223 def test_setup(self): 1213 self.failUnlessEqual(Album.objects.count(), 6)1224 self.failUnlessEqual(Album.objects.count(), 7) 1214 1225 album, created = Album.objects.get_or_create(title='Album One') 1215 1226 self.failUnlessEqual(album.track_count, 0) … … 1219 1230 1220 1231 def test_active(self): 1221 self.failUnlessEqual(Album.objects.active.count(), 5)1232 self.failUnlessEqual(Album.objects.active.count(), 6) 1222 1233 1223 1234 def test_inactive(self): 1235 self.failUnlessEqual(Album.objects.active.count(), 6) 1224 1236 self.failUnlessEqual(Album.objects.inactive.count(), 1) 1225 1237 1238 # def test_inactive_artist(self): 1239 # artist = Artist.objects.get(name='Artist One') 1240 # artist.active = False 1241 # artist.save() 1242 # self.failUnlessEqual(Album.objects.active.count(), 3) 1243 # self.failUnlessEqual(Album.objects.inactive.count(), 4) 1244 # count = 0 1245 # for album in Album.objects.all(): 1246 # if album.is_active(): 1247 # count += 1 1248 # self.failUnlessEqual(count, Album.objects.active.count()) 1249 # 1226 1250 def test_slug(self): 1227 1251 album1, created = Album.objects.get_or_create(title='Album One') … … 1313 1337 track1.trackfiles.add(trackfile1) 1314 1338 track1.trackfiles.add(trackfile2) 1315 track1. is_active = True1339 track1.active = True 1316 1340 track1.save() 1317 1341 track2, created = Track.objects.get_or_create( … … 1319 1343 ) 1320 1344 track2.trackfiles.add(trackfile3) 1321 track2. is_active = True1345 track2.active = True 1322 1346 track2.save() 1323 1347 track3, created = Track.objects.get_or_create( … … 1325 1349 ) 1326 1350 track3.trackfiles.add(trackfile4) 1327 track3. is_active = True1351 track3.active = True 1328 1352 track3.save() 1329 1353 track4, created = Track.objects.get_or_create( 1330 1354 title='Inactive Track', artist=artist1 1331 1355 ) 1332 track4. is_active = False1356 track4.active = False 1333 1357 track4.save() 1358 delta = datetime.timedelta(minutes=10) 1359 now = datetime.datetime.now() 1360 past = now - delta 1361 future = now + delta 1362 track, created = Track.objects.get_or_create( 1363 title='Unpublished Track', artist=artist1 1364 ) 1365 track.active = True 1366 track.publish = future 1367 track.expire = None 1368 track.save() 1369 track, created = Track.objects.get_or_create( 1370 title='Published Track1', artist=artist1 1371 ) 1372 track.active = True 1373 track.publish = past 1374 track.expire = None 1375 track.save() 1376 track, created = Track.objects.get_or_create( 1377 title='Published Track2', artist=artist1 1378 ) 1379 track.active = True 1380 track.publish = past 1381 track.expire = future 1382 track.save() 1383 track, created = Track.objects.get_or_create( 1384 title='Expired Track', artist=artist1 1385 ) 1386 track.active = True 1387 track.publish = None 1388 track.expire = past 1389 track.save() 1390 track, created = Track.objects.get_or_create( 1391 title='Unexpired Track', artist=artist1 1392 ) 1393 track.active = True 1394 track.publish = None 1395 track.expire = future 1396 track.save() 1334 1397 1335 1398 def tearDown(self): … … 1339 1402 1340 1403 def test_setup(self): 1341 self.failUnlessEqual(Track.objects.count(), 4)1404 self.failUnlessEqual(Track.objects.count(), 9) 1342 1405 track = Track.objects.get(title='Track One') 1343 1406 self.failUnlessEqual(track.trackfiles.count(), 2) 1344 1407 1345 1408 def test_active(self): 1346 self.failUnlessEqual(Track.objects.active.count(), 3) 1409 self.failUnlessEqual(Track.objects.active.count(), 6) 1410 count = 0 1411 for track in Track.objects.all(): 1412 if track.is_active(): 1413 count += 1 1414 self.failUnlessEqual(count, Track.objects.active.count()) 1347 1415 1348 1416 def test_inactive(self): 1349 self.failUnlessEqual(Track.objects.inactive.count(), 1) 1417 self.failUnlessEqual(Track.objects.inactive.count(), 3) 1418 count = 0 1419 for track in Track.objects.all(): 1420 if not track.is_active(): 1421 count += 1 1422 self.failUnlessEqual(count, Track.objects.inactive.count()) 1423 1424 def test_inactive_artist(self): 1425 artist = Artist.objects.get(name='Artist Two') 1426 artist.active = False 1427 artist.save() 1428 self.failUnlessEqual(Track.objects.active.count(), 5) 1429 self.failUnlessEqual(Track.objects.inactive.count(), 4) 1430 count = 0 1431 for track in Track.objects.all(): 1432 if track.is_active(): 1433 count += 1 1434 self.failUnlessEqual(count, Track.objects.active.count()) 1435 1436 def test_inactive_album(self): 1437 album = Album.objects.get(title='Album One') 1438 album.active = False 1439 album.save() 1440 self.failUnlessEqual(Track.objects.active.count(), 5) 1441 self.failUnlessEqual(Track.objects.inactive.count(), 4) 1442 count = 0 1443 for track in Track.objects.all(): 1444 if track.is_active(): 1445 count += 1 1446 self.failUnlessEqual(count, Track.objects.active.count()) 1350 1447 1351 1448 def test_slug(self): … … 1378 1475 TrackFile.objects.add_from_path(ALBUM1_REL) 1379 1476 trackfile = TrackFile.objects.get(relative_path=FILE2_MP3_REL) 1380 trackfile.track. is_active = False1477 trackfile.track.active = False 1381 1478 trackfile.track.save() 1382 1479 … … 1560 1657 self.failIf(imagefile.is_jpg()) 1561 1658 self.failIf(imagefile.is_gif()) 1562 self.failIf(imagefile.is_active) 1659 self.failIf(imagefile.active) 1660 self.failIf(imagefile.is_active()) 1563 1661 self.failUnlessEqual(imagefile.get_absolute_url(), 1564 1662 reverse('djedna_imagefile_detail',
