src/ldtplatform/management/commands/replacedelete.py
changeset 334 0ddcaaf893e9
parent 333 77b56a7aaa7e
child 340 8a73fa27b2e2
equal deleted inserted replaced
333:77b56a7aaa7e 334:0ddcaaf893e9
    65     '''
    65     '''
    66     construct youtube video oembed link
    66     construct youtube video oembed link
    67     '''
    67     '''
    68     if re.match(r".*feature=player_embedded.+", source) != None:
    68     if re.match(r".*feature=player_embedded.+", source) != None:
    69         return "http://www.youtube.com/oembed?url=http://youtube.com/watch?v="\
    69         return "http://www.youtube.com/oembed?url=http://youtube.com/watch?v="\
    70         + source[len(source)-11:] +"&format=json"
    70             + source[len(source)-11:] +"&format=json"
    71     return "http://www.youtube.com/oembed?url=" + source + "&format=json"
    71     return "http://www.youtube.com/oembed?url=" + source + "&format=json"
    72 
    72 
    73 class Command(BaseCommand):
    73 class Command(BaseCommand):
    74     '''
    74     '''
    75     Command class
    75     Command class
    78 
    78 
    79     def add_arguments(self, parser):
    79     def add_arguments(self, parser):
    80         '''
    80         '''
    81         add arguments
    81         add arguments
    82         '''
    82         '''
    83         parser.add_argument('-f',
    83         parser.add_argument(
    84                             '--force',
    84             '-f',
    85                             dest='force',
    85             '--force',
    86                             action='store_true'
    86             dest='force',
    87                             )
    87             action='store_true'
    88         parser.add_argument('-p',
    88         )
    89                             '--path',
    89         parser.add_argument(
    90                             dest='path',
    90             '-p',
    91                             default=None
    91             '--path',
    92                             )
    92             dest='path',
       
    93             default=None
       
    94         )
    93 
    95 
    94 
    96 
    95     def construct_ldt_embed(self, ldtid):
    97     def construct_ldt_embed(self, ldtid):
    96         '''
    98         '''
    97         construct ldt embed
    99         construct ldt embed
    99         return "http://{base_url}ldtplatform/ldt/embed/v3/config?json_url=" \
   101         return "http://{base_url}ldtplatform/ldt/embed/v3/config?json_url=" \
   100                    "http://{base_url}ldtplatform/ldt/cljson/id/{ldt_id}&" \
   102                    "http://{base_url}ldtplatform/ldt/cljson/id/{ldt_id}&" \
   101                    "player_id=player_project_{ldt_id}&" \
   103                    "player_id=player_project_{ldt_id}&" \
   102                    "ldt_id={ldt_id}".format(base_url=self.base_url, ldt_id=ldtid)
   104                    "ldt_id={ldt_id}".format(base_url=self.base_url, ldt_id=ldtid)
   103 
   105 
   104     def clean_media_project(self, element, force, newsrc=None):
   106     def clean_media_project(self, element, newsrc=None):
   105         '''
   107         '''
   106         change media objects' videopath and source if necessary
   108         change media objects' videopath and source if necessary
   107         change project .ldt
   109         change project .ldt
   108         '''
   110         '''
   109         basesrc = element.src
   111         basesrc = element.src
   110         if force:
   112         if self.force:
   111             element.videopath = ''
   113             element.videopath = ''
   112             element.save()
   114             element.save()
   113         if newsrc != None:
   115         if newsrc != None:
   114             if force:
   116             if self.force:
   115                 element.src = newsrc
   117                 element.src = newsrc
   116                 element.save()
   118                 element.save()
   117             self.mycsvfile.writerow([
   119             self.mycsvfile.writerow([
   118                 "Media",
   120                 "Media",
   119                 basesrc,
   121                 basesrc,
   126                 "Project",
   128                 "Project",
   127                 element.src,
   129                 element.src,
   128                 "Yes",
   130                 "Yes",
   129                 "initializing object(no project)"
   131                 "initializing object(no project)"
   130                 ])
   132                 ])
   131             if force:
   133             if self.force:
   132                 mycontentid = models.Content.objects.filter(media_obj_id=element.id)[0].iri_id
   134                 mycontentid = models.Content.objects.filter(media_obj_id=element.id)[0].iri_id
   133                 try:
   135                 try:
   134                     management.call_command('initfrontproject', mycontentid)
   136                     management.call_command('initfrontproject', mycontentid)
   135                 except Exception:
   137                 except Exception:
   136                     self.mycsvfile.writerow([
   138                     self.mycsvfile.writerow([
   142                     return
   144                     return
   143                 self.stdout.write(" Initializing project", ending='')
   145                 self.stdout.write(" Initializing project", ending='')
   144             else:
   146             else:
   145                 self.stdout.write(" Project has to be initialized ", ending='')
   147                 self.stdout.write(" Project has to be initialized ", ending='')
   146                 return
   148                 return
   147         ldtproj = models.Project.objects.filter\
   149         ldtproj = models.Project.objects.filter(
   148         (content=models.Content.objects.filter(media_obj_id=element.id)[0])
   150             content=models.Content.objects.filter(media_obj_id=element.id)[0]
       
   151         )
   149         for singleproject in ldtproj:
   152         for singleproject in ldtproj:
   150             root = etree.XML(singleproject.ldt.encode('utf-8'), self.parser)
   153             root = etree.XML(singleproject.ldt.encode('utf-8'), self.parser)
   151             if root.xpath('medias/media') == []:
   154             if root.xpath('medias/media') == []:
   152                 self.stdout.write(" le .ldt ne contient pas de media", ending='')
   155                 self.stdout.write(" le .ldt ne contient pas de media", ending='')
   153                 continue
   156                 continue
   154             if root.xpath('medias/media')[0].get("video") != '':
   157             if root.xpath('medias/media')[0].get("video") != '':
   155                 embedurl = self.construct_ldt_embed(singleproject.ldt_id)
   158                 embedurl = self.construct_ldt_embed(singleproject.ldt_id)
   156                 if force:
   159                 if self.force:
   157                     root.xpath('medias/media')[0].set("video", '')
   160                     root.xpath('medias/media')[0].set("video", '')
   158                 self.stdout.write(" changing videopath arg in .ldt ", ending='')
   161                 self.stdout.write(" changing videopath arg in .ldt ", ending='')
   159                 self.mycsvfile.writerow([
   162                 self.mycsvfile.writerow([
   160                     "Project",
   163                     "Project",
   161                     embedurl,
   164                     embedurl,
   167                 singleproject.save()
   170                 singleproject.save()
   168                 self.logger.info("%s DONE\n", embedurl)
   171                 self.logger.info("%s DONE\n", embedurl)
   169         element.save()
   172         element.save()
   170 
   173 
   171 
   174 
   172 
   175     def __init__(self, *args, **kwargs):
   173     def handle(self, *args, **options):
   176         super(Command, self).__init__(*args, **kwargs)
   174         '''
       
   175         handle
       
   176         '''
       
   177         self.base_url = Site.objects.get_current().domain + settings.BASE_URL
   177         self.base_url = Site.objects.get_current().domain + settings.BASE_URL
   178         self.parser = etree.XMLParser(encoding='utf-8')
   178         self.parser = etree.XMLParser(encoding='utf-8')
   179         self.logger = logging.getLogger(__name__)
   179         self.logger = logging.getLogger(__name__)
       
   180         self.force = False
       
   181         self.mycsvfile = None
       
   182 
       
   183 
       
   184     def handle(self, *args, **options):
       
   185         '''
       
   186         handle
       
   187         '''
   180         path = options['path']
   188         path = options['path']
   181         force = options['force']
   189         self.force = options['force']
   182         if not path:
   190         if not path:
   183             path = 'mediaInformations.csv'
   191             path = 'mediaInformations.csv'
   184         try:
   192         try:
   185             csvfile = open(path, 'wb')
   193             csvfile = open(path, 'wb')
   186         except IOError:
   194         except IOError:
   197             ])
   205             ])
   198         j = 0
   206         j = 0
   199         files1 = models.Media.objects.all() #this list contains every media
   207         files1 = models.Media.objects.all() #this list contains every media
   200         for elem1 in files1:
   208         for elem1 in files1:
   201             if number_of_contents(elem1) == 0:
   209             if number_of_contents(elem1) == 0:
   202                 if force:
   210                 if self.force:
   203                     elem1.delete()  #if there is no content
   211                     elem1.delete()  #if there is no content
   204                     #linked to the media, the media is removed for the database
   212                     #linked to the media, the media is removed for the database
   205                     self.stdout.write(" No content found, media has been removed")
   213                     self.stdout.write(" No content found, media has been removed")
   206                 else:
   214                 else:
   207                     self.stdout.write(" No content found, media will be removed")
   215                     self.stdout.write(" No content found, media will be removed")
   212                     "deleting object (no content)"
   220                     "deleting object (no content)"
   213                     ])
   221                     ])
   214                 j += 1
   222                 j += 1
   215                 continue
   223                 continue
   216             if elem1.src.lower() == to_https(elem1.src, elem1.videopath).lower():
   224             if elem1.src.lower() == to_https(elem1.src, elem1.videopath).lower():
   217                 self.clean_media_project(elem1, force)
   225                 self.clean_media_project(elem1)
   218             if re.match(r".*\.youtube\.com.*", elem1.src) != None\
   226             if re.match(r".*\.youtube\.com.*", elem1.src) != None \
   219             or re.match(r".*youtu\.be.+", elem1.src) != None:
   227                 or re.match(r".*youtu\.be.+", elem1.src) != None:
   220                 myembed = construct_youtube_embed(elem1.src)
   228                 myembed = construct_youtube_embed(elem1.src)
   221                 if requests.get(myembed).status_code == 404:
   229                 if requests.get(myembed).status_code == 404:
   222                     self.stdout.write("%s : Video doesn't exists"% elem1.src)
   230                     self.stdout.write("%s : Video doesn't exists"% elem1.src)
   223                     if number_of_projects(elem1) > 0:
   231                     if number_of_projects(elem1) > 0:
   224                         ldtproj = models.Project.objects.get(id=models.Content.objects.filter\
   232                         ldtproj = models.Project.objects.get(
   225                         (media_obj_id=elem1.id)[0].front_project_id).ldt
   233                             id=models.Content.objects.filter(
       
   234                                 media_obj_id=elem1.id
       
   235                                 )[0].front_project_id
       
   236                             ).ldt
   226                         root = etree.XML(ldtproj.encode('utf-8'), self.parser)
   237                         root = etree.XML(ldtproj.encode('utf-8'), self.parser)
   227                         if root.xpath('annotations/content/ensemble/decoupage/elements/element')\
   238                         if root.xpath(
   228                         == []:
   239                                 'annotations/content/ensemble/decoupage/elements/element'
   229                             if force:
   240                             ) == []:
       
   241                             if self.force:
   230                                 elem1.delete()
   242                                 elem1.delete()
   231                                 self.stdout.write("video doesn't exist anymore : media deleted")
   243                                 self.stdout.write("video doesn't exist anymore : media deleted")
   232                             self.mycsvfile.writerow([
   244                             self.mycsvfile.writerow([
   233                                 "Media/Content/Project",
   245                                 "Media/Content/Project",
   234                                 elem1.src,
   246                                 elem1.src,
   235                                 "Yes",
   247                                 "Yes",
   236                                 "deleting(Video doesn't exist anymore + empty projects)"
   248                                 "deleting(Video doesn't exist anymore + empty projects)"
   237                                 ])
   249                                 ])
   238                             j += 1
   250                             j += 1
   239                 else:
   251                 else:
   240                     self.clean_media_project(elem1, force)
   252                     self.clean_media_project(elem1)
   241         if force:
   253         if self.force:
   242             self.stdout.write("%s files deleted"%j)
   254             self.stdout.write("%s files deleted"%j)
   243         else:
   255         else:
   244             self.stdout.write("%s files to delete"%j)
   256             self.stdout.write("%s files to delete"%j)
   245         i = 0
   257         i = 0
   246         files = list(chain(
   258         files = list(chain(
   323                     newsource
   335                     newsource
   324                     ])
   336                     ])
   325                 continue
   337                 continue
   326             if res > 400:
   338             if res > 400:
   327                 try:
   339                 try:
   328                     ressrc = requests.head(to_https(elem.src, elem.videopath, 0),\
   340                     ressrc = requests.head(
   329                     timeout=10).status_code
   341                         to_https(elem.src, elem.videopath, 0),
       
   342                         timeout=10
       
   343                         ).status_code
   330                 except (requests.exceptions.Timeout, requests.ConnectionError):
   344                 except (requests.exceptions.Timeout, requests.ConnectionError):
   331                     self.stdout.write(" can't access source/new files", ending='')
   345                     self.stdout.write(" can't access source/new files", ending='')
   332                     self.logger.warning("can't access %s", elem.title)
   346                     self.logger.warning("can't access %s", elem.title)
   333                     res = "connection error"
   347                     res = "connection error"
   334                     self.mycsvfile.writerow([
   348                     self.mycsvfile.writerow([
   350                         newsource
   364                         newsource
   351                         ])
   365                         ])
   352                 elif ressrc == 200:
   366                 elif ressrc == 200:
   353                     self.stdout.write(
   367                     self.stdout.write(
   354                         " file not transcoded yet :"
   368                         " file not transcoded yet :"
   355                         "keep source extension or wait transcoding to be done",\
   369                         "keep source extension or wait transcoding to be done",
   356                         ending='')
   370                         ending='')
   357                     self.logger.warning("%s not transcoded yet", elem.title)
   371                     self.logger.warning("%s not transcoded yet", elem.title)
   358                     self.mycsvfile.writerow([
   372                     self.mycsvfile.writerow([
   359                         "Media",
   373                         "Media",
   360                         mysrc,
   374                         mysrc,
   377                     newsource,
   391                     newsource,
   378                     "No",
   392                     "No",
   379                     "new source already in table"
   393                     "new source already in table"
   380                     ])
   394                     ])
   381                 continue
   395                 continue
   382             self.clean_media_project(elem, force, newsource)
   396             self.clean_media_project(elem, newsource)
   383         csvfile.close()
   397         csvfile.close()