116 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os.path
 | |
| import time
 | |
| 
 | |
| from euscanwww import settings
 | |
| 
 | |
| from django.db.models import F, Sum, Max
 | |
| from euscan.models import Version, Package, Herd, Maintainer
 | |
| from euscan.models import CategoryLog
 | |
| 
 | |
| import pylab
 | |
| import matplotlib
 | |
| 
 | |
| CHARTS_ROOT = os.path.join(settings.MEDIA_ROOT, "charts")
 | |
| CHARTS_URL = os.path.join(settings.MEDIA_URL, "charts")
 | |
| CHARTS_TTL = (24 * 60 * 60)
 | |
| 
 | |
| pylab.rcParams['font.size'] = 10.0
 | |
| pylab.rcParams['axes.titlesize'] = 10.0
 | |
| pylab.rcParams['xtick.labelsize'] = 8.0
 | |
| pylab.rcParams['legend.fontsize'] = 8.0
 | |
| 
 | |
| def xint(i):
 | |
|     try:
 | |
|         return int(i)
 | |
|     except:
 | |
|         return 0
 | |
| 
 | |
| def chart_alive(name):
 | |
|     path = os.path.join(CHARTS_ROOT, name)
 | |
|     if not os.path.exists(path):
 | |
|         return False
 | |
|     if os.path.getmtime(__file__) > os.path.getmtime(path):
 | |
|         return False
 | |
|     if os.path.getmtime(path) + CHARTS_TTL < time.time():
 | |
|         return False
 | |
|     return True
 | |
| 
 | |
| def chart_name(name, **kwargs):
 | |
|     if 'category' in kwargs and kwargs['category']:
 | |
|         name += '-%s' % kwargs['category']
 | |
|     if 'herd' in kwargs and kwargs['herd']:
 | |
|         name += '-h-%d' % kwargs['herd'].id
 | |
|     if 'maintainer' in kwargs and kwargs['maintainer']:
 | |
|         name += '-m-%d' % kwargs['maintainer'].id
 | |
|     return name + ".png"
 | |
| 
 | |
| def packages(**kwargs):
 | |
|     packages = Package.objects
 | |
| 
 | |
|     if 'category' in kwargs and kwargs['category']:
 | |
|         packages = packages.filter(category=kwargs['category'])
 | |
|     if 'herd' in kwargs and kwargs['herd']:
 | |
|         packages = packages.filter(herds__id=kwargs['herd'].id)
 | |
|     if 'maintainer' in kwargs and kwargs['maintainer']:
 | |
|         packages = packages.filter(maintainers__id=kwargs['maintainer'].id)
 | |
| 
 | |
|     return packages
 | |
| 
 | |
| def cached_pylab_chart(f):
 | |
|     def new_f(*args, **kwds):
 | |
|         name = chart_name(f.func_name, **kwds)
 | |
| 
 | |
|         if not chart_alive(name):
 | |
|             f(*args, **kwds)
 | |
|             pylab.savefig(os.path.join(CHARTS_ROOT, name))
 | |
|             pylab.close()
 | |
| 
 | |
|         return name
 | |
| 
 | |
|     new_f.func_name = f.func_name
 | |
|     return new_f
 | |
| 
 | |
| @cached_pylab_chart
 | |
| def pie_versions(**kwargs):
 | |
|     n_packaged = xint(packages(**kwargs).aggregate(Sum('n_packaged'))['n_packaged__sum'])
 | |
|     n_overlay = xint(packages(**kwargs).aggregate(Sum('n_overlay'))['n_overlay__sum'])
 | |
|     n_versions = xint(packages(**kwargs).aggregate(Sum('n_versions'))['n_versions__sum'])
 | |
|     n_upstream = n_versions - n_packaged - n_overlay
 | |
| 
 | |
|     pylab.figure(1, figsize=(3.5,3.5))
 | |
| 
 | |
|     if n_overlay:
 | |
|         labels = 'Gentoo', 'Overlays', 'Upstream'
 | |
|         fracs = [n_packaged, n_overlay, n_upstream]
 | |
|         colors = '#008000', '#0B17FD', '#FF0000'
 | |
|     else:
 | |
|         labels = 'Gentoo', 'Upstream'
 | |
|         fracs = [n_packaged, n_upstream]
 | |
|         colors = '#008000', '#FF0000'
 | |
| 
 | |
|     pylab.pie(fracs, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True)
 | |
|     pylab.title('Versions', bbox={'facecolor':'0.8', 'pad':5})
 | |
| 
 | |
| @cached_pylab_chart
 | |
| def pie_packages(**kwargs):
 | |
|     n_packages = packages(**kwargs).count()
 | |
|     n_packages_uptodate_main = packages(**kwargs).filter(n_versions=F('n_packaged')).count()
 | |
|     n_packages_uptodate_all = packages(**kwargs).filter(n_versions=F('n_packaged') + F('n_overlay')).count()
 | |
|     n_packages_outdated = n_packages - n_packages_uptodate_all
 | |
|     n_packages_uptodate_ovl = n_packages_uptodate_all - n_packages_uptodate_main
 | |
| 
 | |
|     pylab.figure(1, figsize=(3.5,3.5))
 | |
| 
 | |
|     if n_packages_uptodate_ovl:
 | |
|         labels = 'Ok (gentoo)', 'Ok (overlays)', 'Outdated'
 | |
|         fracs = [n_packages_uptodate_main, n_packages_uptodate_ovl, n_packages_outdated]
 | |
|         colors = '#008000', '#0B17FD', '#FF0000'
 | |
|     else:
 | |
|         labels = 'Ok (gentoo)', 'Outdated'
 | |
|         fracs = [n_packages_uptodate_main, n_packages_outdated]
 | |
|         colors = '#008000', '#FF0000'
 | |
| 
 | |
|     pylab.pie(fracs, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True)
 | |
|     pylab.title('Packages', bbox={'facecolor':'0.8', 'pad':5})
 | |
| 
 |