def renderQuerySetAsTable(queryResults, wikidpage=None, nLinkField=None, source=None, page=0, maxPageRows=MAX_PAGE_ROWS, hiddenHeaders=None, sortField=None) : if not queryResults or len(queryResults) == 0 : return "<div class='system-message'>There are no results for this query</div>" debugOutput("wikidpage.id %s" % (wikidpage and wikidpage.id or None)) queryResultsTemplate = template.loader.get_template("queryresults-table.html") # Get display heading list (e.g. - hidden, fields specificed in query). displayHeadings = _organiseHeadings(queryResults, hiddenHeaders) # Get page worth of query items. noPages = int(math.ceil(len(queryResults.queryResults) / float(maxPageRows))) startIndex = page * maxPageRows endIndex = min(len(queryResults.queryResults), startIndex + maxPageRows) nextPage = page < (noPages - 1) and page + 1 or None if page > 0 : prevPage = page - 1 else : prevPage = None debugOutput("prevpage: %s" % prevPage) pageRange = range(0, noPages) # Get context page for convenient 'add button'. addContextPage = None if not nLinkField : primaryContexts = queryResults.getPrimaryContexts() if primaryContexts and len(primaryContexts) == 1 : nContext = primaryContexts.keys()[0] context = primaryContexts[nContext].capitalize() addContextPage = pagestore.getPageFromContext(nContext) # Sort the date if necessary. if sortField : queryItems = queryResults.sort(sortField[0], sortField[1]) else : queryItems = queryResults.queryResults # Crop the results for this table page. queryItems = queryItems[startIndex:endIndex] context = { "wikidpage":wikidpage, "nLinkField":nLinkField, "addContextPage":addContextPage, "source":source, "page":page, "noPages":noPages, "nextPage":nextPage, "prevPage":prevPage, "pageRange":pageRange, "lastPage":max(noPages-1,0), "maxPageRows":maxPageRows, "displayHeadings":displayHeadings, "queryItems": queryItems, "queryResults": queryResults, "datatype":datatype, } return queryResultsTemplate.render(template.Context(context))
def renderQuerySetAsCalendar(queryResults, dateViewField, currentDate, viewType=None, wikidpage=None, nLinkField=None, source=None) : # TODO: Obtain content fields from table view settings. # TODO: Add add-page on this day option. if not queryResults or len(queryResults) == 0 : return "There are no results for this query" # Get context page for convenient 'add button'. addContextPage = None if not nLinkField : primaryContexts = queryResults.getPrimaryContexts() if primaryContexts and len(primaryContexts) == 1 : nContext = primaryContexts.keys()[0] context = primaryContexts[nContext].capitalize() addContextPage = pagestore.getPageFromContext(nContext) queryResultsTemplate = template.loader.get_template("queryresults-calendar.html") # Get display heading list (e.g. - hidden, fields specificed in query). displayHeadings = _organiseHeadings(queryResults) # Get the first visible date. if viewType == VIEW_DAY : # Same as current date. startDate = currentDate elif viewType == VIEW_WEEK : # Start of week. startDate = currentDate - datetime.timedelta(currentDate.weekday()) else : # Start of month, start of week startDate = currentDate - datetime.timedelta(currentDate.day-1) startDate -= datetime.timedelta(startDate.weekday()) # Work out the number of days to display if viewType == VIEW_DAY : noDays = 1 elif viewType == VIEW_WEEK : noDays = 7 else : noDays = 7*5 # Make a list of visible dates. visibleDates = [startDate + datetime.timedelta(i) for i in range(0,noDays)] dayNames = [visibleDates[i].strftime("%a") for i in range(0,min(7, noDays))] debugOutput("visibleDates %s" % visibleDates) # Populate a calendar matrix with appropriate queryResultsItems dateDict = {} # Sort the queryset ascending by the date field. queryItems = queryResults.sort(dateViewField, wikidbase.core.query.SORT_ASCEND) # Use this to store cell details. class CalendarItem : pass displayDateViewField = None # Store wikidpages with dates in a date-index dictionary. for queryResultsItem in queryItems : field, dataPage, fieldHeading = queryResultsItem.getData(dateViewField) # Store a date field heading suitable for display. if not displayDateViewField : displayDateViewField = fieldHeading pyData = wikidbase.core.datatype.convert(field.data, mode=wikidbase.core.datatype.TO_PYTHON) dataDate = wikidbase.core.datatype.getDatePart(pyData) dataTime = wikidbase.core.datatype.getTimePart(pyData) if not dataDate : continue if dataDate not in dateDict : dateDict[dataDate] = [] # Add helpful info to a cal item object for the template to render. calItem = CalendarItem() calItem.queryResultsItem = queryResultsItem # Choose the display field for the cal item. if displayHeadings : displayField = queryResultsItem.getData(displayHeadings.keys()[0]) else : displayField = None if not (displayField and displayField[0] and displayField[0].data) : displayField = queryResultsItem.getData("page") calItem.wikidpage = displayField[1] calItem.content = displayField[0].data # Add time calItem.time = dataTime dateDict[dataDate].append(calItem) dateMatrix = [] for i in range(0, (len(visibleDates) / 7) or 1) : dateRow = [] for j in range(0,min(7, len(visibleDates))) : dateRow.append(visibleDates[i*7 + j]) dateMatrix.append(dateRow) dateRow = [] debugOutput("dateMatrix %s" % dateMatrix) # Calculate page navigation stuff. # TODO: Update for days and weeks if viewType == VIEW_DAY : daysToNextPage, daysToPrevPage = 1, -1 elif viewType == VIEW_WEEK : daysToNextPage, daysToPrevPage = 7, -7 else : daysToNextPage = 1 + calendar.monthrange(currentDate.year, currentDate.month)[1] - currentDate.day lastMonth = currentDate - datetime.timedelta(currentDate.day) daysToPrevPage = 1 - currentDate.day - calendar.monthrange(lastMonth.year, lastMonth.month)[1] context = { "source":source, "dayNames":dayNames, "visibleDates":visibleDates, "dateMatrix":dateMatrix, "dateDict":dateDict, "currentDate":currentDate, "today":datetime.date.today(), "daysToNextPage":daysToNextPage, "daysToPrevPage":daysToPrevPage, "datatype":wikidbase.core.datatype, "dateViewField":dateViewField, "displayDateViewField":displayDateViewField, "viewType":viewType, "random":random, "addContextPage":addContextPage, } return queryResultsTemplate.render(template.Context(context))