Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 573396 Details for
Bug 772040
SM GUI: search filters do not factor in date ranges
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
A good start to a solution for this BZ.
0001-772040-Consider-date-range-overlap-for-overlap-filte.patch (text/plain), 12.51 KB, created by
Michael Stead
on 2012-03-28 16:38:37 UTC
(
hide
)
Description:
A good start to a solution for this BZ.
Filename:
MIME Type:
Creator:
Michael Stead
Created:
2012-03-28 16:38:37 UTC
Size:
12.51 KB
patch
obsolete
>From 0766db503e567fe687586eaf53310f5a482b100c Mon Sep 17 00:00:00 2001 >From: Michael Stead <mstead@redhat.com> >Date: Tue, 27 Mar 2012 11:37:42 -0300 >Subject: [PATCH] 772040: Consider date range overlap for overlap filter. > >--- > src/subscription_manager/managerlib.py | 32 ++++++++-- > test/modelhelpers.py | 17 ++++-- > test/test_managerlib.py | 101 ++++++++++++++++++++++++++----- > 3 files changed, 122 insertions(+), 28 deletions(-) > >diff --git a/src/subscription_manager/managerlib.py b/src/subscription_manager/managerlib.py >index cffc7b5..dfea369 100644 >--- a/src/subscription_manager/managerlib.py >+++ b/src/subscription_manager/managerlib.py >@@ -250,17 +250,37 @@ class PoolFilter(object): > entitled_products.append(product.getHash()) > return entitled_products > >+ def _get_entitled_product_to_cert_map(self): >+ entitled_products_to_certs = {} >+ for cert in self.entitlement_directory.list(): >+ for product in cert.getProducts(): >+ prod_id = product.getHash() >+ if prod_id not in entitled_products_to_certs: >+ entitled_products_to_certs[prod_id] = set() >+ entitled_products_to_certs[prod_id].add(cert) >+ return entitled_products_to_certs >+ >+ def _dates_overlap(self, pool, certs): >+ pool_start = parseDate(pool['startDate']) >+ pool_end = parseDate(pool['endDate']) >+ >+ for cert in certs: >+ cert_range = cert.validRange() >+ if cert_range.hasDate(pool_start) or cert_range.hasDate(pool_end): >+ return True >+ return False >+ > def filter_out_overlapping(self, pools): >- entitled_product_ids = self._get_entitled_product_ids() >+ entitled_product_ids_to_certs = self._get_entitled_product_to_cert_map() > filtered_pools = [] > for pool in pools: > provided_ids = [p['productId'] for p in pool['providedProducts']] > overlap = False >- for productid in entitled_product_ids: >- if str(productid) in provided_ids or \ >- str(productid) == pool['productId']: >- overlap = True >- break >+ for productid in entitled_product_ids_to_certs.keys(): >+ if str(productid) in provided_ids or str(productid) == pool['productId']: >+ if self._dates_overlap(pool, entitled_product_ids_to_certs[productid]): >+ overlap = True >+ break > if not overlap: > filtered_pools.append(pool) > return filtered_pools >diff --git a/test/modelhelpers.py b/test/modelhelpers.py >index 365617b..bf41f0e 100644 >--- a/test/modelhelpers.py >+++ b/test/modelhelpers.py >@@ -23,11 +23,17 @@ from datetime import timedelta, datetime > > > def create_pool(product_id, product_name, quantity=10, consumed=0, provided_products=[], >- attributes=[], productAttributes=[]): >+ attributes=[], productAttributes=[], start_end_range = None): > """ > Returns a hash representing a pool. Used to simulate the JSON returned > from Candlepin. > """ >+ start_date = datetime.now() - timedelta(days=365) >+ end_date = datetime.now() - timedelta(days=365) >+ if start_end_range: >+ start_date = start_end_range.begin() >+ end_date = start_end_range.end() >+ > provided = [] > for pid in provided_products: > provided.append({ >@@ -39,6 +45,7 @@ def create_pool(product_id, product_name, quantity=10, consumed=0, provided_prod > md5sum.update(product_id) > pool_id = md5sum.hexdigest() > >+ updated_and_created = datetime.now() - timedelta(days=365) > return { > 'productName': product_name, > 'productId': product_id, >@@ -46,10 +53,10 @@ def create_pool(product_id, product_name, quantity=10, consumed=0, provided_prod > 'consumed': consumed, > 'id': pool_id, > 'subscriptionId': '402881062bc9a379012bc9a3d7380050', >- 'startDate': datetime.now() - timedelta(days=365), >- 'endDate': datetime.now() + timedelta(days=365), >- 'updated': datetime.now() - timedelta(days=365), >- 'created': datetime.now() - timedelta(days=365), >+ 'startDate': start_date.strftime('%Y-%m-%dT%H:%M:%S.0000+0000'), >+ 'endDate': end_date.strftime('%Y-%m-%dT%H:%M:%S.0000+0000'), >+ 'updated': updated_and_created.strftime('%Y-%m-%dT%H:%M:%S.0000+0000'), >+ 'created': updated_and_created.strftime('%Y-%m-%dT%H:%M:%S.0000+0000'), > 'activeSubscription': True, > 'providedProducts': provided, > 'sourceEntitlement': None, >diff --git a/test/test_managerlib.py b/test/test_managerlib.py >index 05f3157..4df0b76 100644 >--- a/test/test_managerlib.py >+++ b/test/test_managerlib.py >@@ -13,7 +13,7 @@ > # in this software or its documentation. > # > >-import datetime >+from datetime import datetime, timedelta > import time > import unittest > import os >@@ -21,14 +21,12 @@ from os import linesep as NEW_LINE > > from stubs import StubCertificateDirectory, StubProductCertificate, StubProduct, \ > StubEntitlementCertificate >-from subscription_manager.facts import Facts >-from subscription_manager.managerlib import merge_pools, PoolFilter, getInstalledProductStatus, \ >+from subscription_manager.managerlib import PoolFilter, getInstalledProductStatus, \ > LocalTz, parseDate, merge_pools, MergedPoolsStackingGroupSorter >-from modelhelpers import create_pool, create_attribute_list >+from modelhelpers import create_pool > from subscription_manager import managerlib >-import stubs > import rhsm >-from rhsm.certificate import EntitlementCertificate >+from rhsm.certificate import EntitlementCertificate, DateRange > from mock import Mock > import xml > >@@ -282,6 +280,75 @@ class PoolFilterTests(unittest.TestCase): > self.assertEquals(1, len(result)) > self.assertEquals(product1, result[0]['productId']) > >+ def test_filter_no_overlap(self): >+ product1 = "Test Product 1" >+ provided1 = "Provided By Test Product 1" >+ >+ pd = StubCertificateDirectory([]) >+ pool_filter = PoolFilter(product_dir=pd, >+ entitlement_dir=StubCertificateDirectory([])) >+ >+ begin_date = datetime.now() - timedelta(days=10) >+ end_date = datetime.now() + timedelta(days=365) >+ pools = [ >+ create_pool(product1, product1, provided_products=[provided1], >+ start_end_range=DateRange(begin_date, end_date)), >+ ] >+ result = pool_filter.filter_out_overlapping(pools) >+ self.assertEquals(1, len(result)) >+ >+ result = pool_filter.filter_out_non_overlapping(pools) >+ self.assertEquals(0, len(result)) >+ >+ def test_filter_overlap(self): >+ product1 = "Test Product 1" >+ provided1 = "Provided By Test Product 1" >+ >+ cert_start = datetime.now() - timedelta(days=10) >+ cert_end = datetime.now() + timedelta(days=365) >+ cert1 = StubProductCertificate(StubProduct(provided1), >+ start_date=cert_start, >+ end_date=cert_end) >+ >+ ent_dir = StubCertificateDirectory([cert1]) >+ pool_filter = PoolFilter(product_dir=StubCertificateDirectory([]), >+ entitlement_dir=ent_dir) >+ >+ pools = [ >+ create_pool(product1, product1, provided_products=[provided1], >+ start_end_range=DateRange(cert_start, cert_end)), >+ ] >+ result = pool_filter.filter_out_overlapping(pools) >+ self.assertEquals(0, len(result)) >+ >+ result = pool_filter.filter_out_non_overlapping(pools) >+ self.assertEquals(1, len(result)) >+ >+ def test_filter_no_overlap_with_future_entitlement(self): >+ product1 = "Test Product 1" >+ provided1 = "Provided By Test Product 1" >+ >+ cert_start = datetime.now() + timedelta(days=365) >+ cert_end = cert_start + timedelta(days=365) >+ cert1 = StubProductCertificate(StubProduct(provided1), >+ start_date=cert_start, >+ end_date=cert_end) >+ >+ ent_dir = StubCertificateDirectory([cert1]) >+ pool_filter = PoolFilter(product_dir=StubCertificateDirectory([]), >+ entitlement_dir=ent_dir) >+ >+ begin_date = datetime.now() - timedelta(days=100) >+ end_date = datetime.now() + timedelta(days=100) >+ pools = [ >+ create_pool(product1, product1, provided_products=[provided1], >+ start_end_range=DateRange(begin_date, end_date)), >+ ] >+ result = pool_filter.filter_out_overlapping(pools) >+ self.assertEquals(1, len(result)) >+ >+ result = pool_filter.filter_out_non_overlapping(pools) >+ self.assertEquals(0, len(result)) > > class InstalledProductStatusTests(unittest.TestCase): > >@@ -315,7 +382,7 @@ class InstalledProductStatusTests(unittest.TestCase): > StubProductCertificate(product)]) > entitlement_directory = StubCertificateDirectory([ > StubEntitlementCertificate(product, >- end_date=(datetime.datetime.now() - datetime.timedelta(days=2)))]) >+ end_date=(datetime.now() - timedelta(days=2)))]) > > product_status = getInstalledProductStatus(product_directory, > entitlement_directory) >@@ -341,7 +408,7 @@ class InstalledProductStatusTests(unittest.TestCase): > StubProductCertificate(product)]) > entitlement_directory = StubCertificateDirectory([ > StubEntitlementCertificate(product, >- start_date=(datetime.datetime.now() + datetime.timedelta(days=1365)))]) >+ start_date=(datetime.now() + timedelta(days=1365)))]) > > product_status = getInstalledProductStatus(product_directory, > entitlement_directory) >@@ -413,8 +480,8 @@ class InstalledProductStatusTests(unittest.TestCase): > class TestParseDate(unittest.TestCase): > def _test_local_tz(self): > tz = LocalTz() >- dt_no_tz = datetime.datetime(year=2000, month=1, day=1, hour=12, minute=34) >- now_dt = datetime.datetime(year=2000, month=1, day=1, hour=12, minute=34, tzinfo=tz) >+ dt_no_tz = datetime(year=2000, month=1, day=1, hour=12, minute=34) >+ now_dt = datetime(year=2000, month=1, day=1, hour=12, minute=34, tzinfo=tz) > parseDate(now_dt.isoformat()) > # last member is is_dst, which is -1, if there is no tzinfo, which > # we expect for dt_no_tz >@@ -434,7 +501,7 @@ class TestParseDate(unittest.TestCase): > > # add an hour for comparisons > dt_no_tz_dst = dt_no_tz >- dt_no_tz_dst = dt_no_tz + datetime.timedelta(hours=1) >+ dt_no_tz_dst = dt_no_tz + timedelta(hours=1) > self.assertEquals(now_dt_tt[3], dt_no_tz_dst.timetuple()[3]) > else: > self.assertEquals(now_dt_tt[:7], dt_no_tz_tt[:7]) >@@ -455,14 +522,14 @@ class TestParseDate(unittest.TestCase): > server_date = "2012-04-10T00:00:00.000+0000" > dt = parseDate(server_date) > # no dst >- self.assertEquals(datetime.timedelta(seconds=0), dt.tzinfo.dst(dt)) >+ self.assertEquals(timedelta(seconds=0), dt.tzinfo.dst(dt)) > # it's a utc date, no offset >- self.assertEquals(datetime.timedelta(seconds=0), dt.tzinfo.utcoffset(dt)) >+ self.assertEquals(timedelta(seconds=0), dt.tzinfo.utcoffset(dt)) > > def test_server_date_est_timezone(self): > est_date = "2012-04-10T00:00:00.000-04:00" > dt = parseDate(est_date) >- self.assertEquals(datetime.timedelta(hours=4), dt.tzinfo.utcoffset(dt)) >+ self.assertEquals(timedelta(hours=4), dt.tzinfo.utcoffset(dt)) > > > # http://docs.python.org/library/datetime.html >@@ -471,14 +538,14 @@ class TestLocalTz(unittest.TestCase): > def _testDst(self): > tz = LocalTz() > epoch = time.time() >- now_dt = datetime.datetime.fromtimestamp(epoch, tz=tz) >+ now_dt = datetime.fromtimestamp(epoch, tz=tz) > diff_now = tz.utcoffset(now_dt) - tz.dst(now_dt) >- td = datetime.timedelta(weeks=26) >+ td = timedelta(weeks=26) > dt = now_dt + td > > diff_six_months = tz.utcoffset(dt) - tz.dst(dt) > >- week_ago_dt = dt - datetime.timedelta(weeks=4) >+ week_ago_dt = dt - timedelta(weeks=4) > diff_week_ago = tz.utcoffset(week_ago_dt) - tz.dst(week_ago_dt) > > print diff_now, diff_six_months, diff_week_ago >-- >1.7.6.5 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 772040
: 573396