Exemplo n.º 1
0
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))
Exemplo n.º 2
0
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))