Changeset 557

Show
Ignore:
Timestamp:
11/27/08 15:58:16 (6 weeks ago)
Author:
av
Message:

Improved sync.py utility:

  • added help
  • added -q (quite) key
  • added -i key to ignore upload errors by regexp in update_log
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • modules/trunk/GoogleBase/sync.py

    r498 r557  
    11#!/usr/bin/env python 
     2"""NAME 
     3     sync.py 
     4   
     5DESCRIPTION 
     6     Syncrolize google products with remote ones stored on google/base server. 
     7     
     8SYNOPSIS 
     9    sync.py [-q] [-i regexp]... 
    210 
    3 from datetime import date, timedelta 
    4 #from django.conf import settings 
    5 from django.db import models 
    6 import djw.modules.GoogleBase.settings as settings 
    7 from django.db.models import Q 
    8 from djw.modules.GoogleBase.models import GoogleProduct,GoogleProductDeleted 
    9 from djw.modules.GoogleBase.google import google_client 
    10 import djw.modules.GoogleBase.log as log 
     11PARAMETERS 
     12    -q      be quietly - display messages only on errors 
     13     
     14    -i regexp 
     15            ignore errors with if python regexp found in update log  
    1116 
    12 def exec_sync(): 
    13     """Refresh all products on remote GoogleBase 
     17INFO 
     18    Should executed with DJANGO_SETTINGS_MODULE set before 
     19    (recommended to use run.py utility)      
     20    If 30 upload errors occured then process is terminated. 
     21  
     22EXAMPLES 
     23    run.py sync.py -i ""child sex"" 
     24""" 
     25from sys import argv 
    1426 
    15     If 30 errors occured in process then exit. 
     27def exec_sync(argv): 
     28    from datetime import date, timedelta 
     29    from django.db import models 
     30    import djw.modules.GoogleBase.settings as settings 
     31    from django.db.models import Q 
     32    from djw.modules.GoogleBase.models import GoogleProduct,GoogleProductDeleted 
     33    from djw.modules.GoogleBase.google import google_client 
     34 
     35    # quiet (display only errors) 
     36    quiet = argv.count('-q') > 0 
     37 
     38    # create RE-list of ignored errors (from -i arguments) 
     39    igns = [argv[i+1] for i in range(len(argv)) if argv[i] == '-i'] 
     40    ignore_relist = [re.compile(s) for s in igns] 
    1641     
    17     """ 
     42    def must_ignore_error(error): 
     43        """ return true if error must ignored """ 
     44        for i in ignore_relist: 
     45            if i.search(error) is not None: 
     46                return True 
     47        return False 
    1848 
    19     log.info("Synchronizing remote GoogleBase...") 
     49    def log(message, display=quiet): 
     50        if not quiet or forse_display: 
     51            print(message) 
     52 
     53    log("Synchronizing remote GoogleBase...") 
    2054    # Delete deferred products 
    2155    # (cannot use "GoogleProductDeleted.objects.all().delete()" because in that way "delete" method is not called for 
    2256    # each product) 
    23     log.info("Deleting deferred products...") 
     57    log("Deleting deferred products...") 
    2458    for prod in GoogleProductDeleted.objects.all(): 
    25         log.info("Deleting '%s'..." % prod) 
     59        log("Deleting '%s'..." % prod) 
    2660        prod.delete()     
    2761     
    28     log.info("Uploading deferred products...") 
     62    log("Uploading deferred products...") 
    2963    errors = 0 
    3064    # refresh changed or expired products  
    3165    for prod in GoogleProduct.objects.filter(Q(changed = True)|Q(exp_date__lte = date.today() + timedelta(1))): 
    3266 
    33         log.info("Uploading '%s'..." % prod)         
     67        #log("Uploading '%s'..." % prod) 
    3468        # Updload product on GoogleBase 
    3569        (is_uploaded, upload_log) = prod.upload_to_google_base() 
     
    3771        # if product still not uploaded print log messages 
    3872        if is_uploaded: 
    39             log.info("OK") 
    40         else:             
    41             log.info("Error. See GoogleProduct admin table for details.") 
    42  
    43             errors += 1 
     73            log("Product %s uploaded successfully." % (prod)) 
     74        else: 
     75            if not must_ignore_error(update_log):                 
     76                log("Product %s upload error: %s." % (prod, upload_log), True) 
     77                errors += 1 
    4478 
    4579            if errors > 30: 
    46                 log.info("Error number is 30. Sync process stopped." ) 
     80                log("Error number is 30. Sync process terminated.", True) 
    4781                break             
    4882 
    4983if __name__ == "__main__": 
    50     exec_sync() 
     84    if argv.count('--help') > 0: 
     85        print __doc__ 
     86    else: 
     87        exec_sync(argv)