Exemplo n.º 1
0
 /**
  * @todo: docs
  */
 public function get_comments(array $args)
 {
     if ($args['type'] != 1) {
         throw new midgardmvc_exception_notfound("Only CONTENT type supported");
     }
     $cnt = 0;
     $package = new com_meego_package();
     $ocs = new com_meego_ocs_OCSWriter();
     try {
         $package->get_by_id((int) $args['contentid1']);
     } catch (midgard_error_exception $e) {
         $error = true;
         $this->mvc->log(__CLASS__, 'Probably missing package with id:  ' . $args['contentid1'] . '.', 'warning');
         $ocs->writeError('Package not found', 101);
         $ocs->endDocument();
         self::output_xml($ocs);
     }
     $storage = new midgard_query_storage('com_meego_package_ratings');
     $q = new midgard_query_select($storage);
     $qc = new midgard_query_constraint_group('AND');
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('authorguid'), '<>', new midgard_query_value('')));
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('name'), '=', new midgard_query_value($package->name)));
     $q->set_constraint($qc);
     $q->add_order(new midgard_query_property('posted', $storage), SORT_ASC);
     // First run a query of the whole set to get results count
     $q->execute();
     $cnt = $q->get_results_count();
     list($limit, $offset) = $this->limit_and_offset_from_query();
     $q->set_limit($limit);
     $q->set_offset($offset);
     $q->execute();
     $comments = $q->list_objects();
     foreach ($comments as $comment) {
         if ($comment->commentid == 0 && !$this->mvc->configuration->show_ratings_without_comments) {
             // skip the rating if it has no comment and the configuration excludes such ratings
             --$cnt;
         }
     }
     $ocs->writeMeta($cnt);
     $ocs->startElement('data');
     // todo: again this loop..  a bit redundant, but works for now
     foreach ($comments as $comment) {
         if ($comment->commentid == 0 && !$this->mvc->configuration->show_ratings_without_comments) {
             // skip the rating if it has no comment and the configuration excludes such ratings
             continue;
         }
         $this->comment_to_ocs($comment, $ocs);
     }
     $ocs->endElement();
     $ocs->endDocument();
     self::output_xml($ocs);
 }
Exemplo n.º 2
0
 private static function get_item_by_url($url)
 {
     $q = new midgard_query_select(new midgard_query_storage('com_meego_planet_item'));
     $q->add_order(new midgard_query_property('metadata.score'), SORT_DESC);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('url'), '=', new midgard_query_value($url)));
     $q->execute();
     if ($q->resultscount == 0) {
         // New item
         $item = new com_meego_planet_item();
         $item->url = $url;
         return $item;
     }
     $list_of_items = $q->list_objects();
     return $list_of_items[0];
 }
Exemplo n.º 3
0
 /**
  * Retrieves all devices
  *
  * @param array filters, possible members: deleted, creator, name, provider
  *              if multiple members used then we do a logical AND with them
  * @return array array of com_meego_devprogram_device objects
  */
 public static function get_devices(array $filters)
 {
     $devices = array();
     $storage = new midgard_query_storage('com_meego_devprogram_device');
     $q = new midgard_query_select($storage);
     if (count($filters) > 1) {
         $qc = new midgard_query_constraint_group('AND');
     }
     foreach ($filters as $filter => $value) {
         switch ($filter) {
             case 'deleted':
                 if ($value) {
                     $q->include_deleted(true);
                 }
                 break;
             case 'creator':
                 // check if the value is a real guid
                 if (mgd_is_guid($value)) {
                     $constraint = new midgard_query_constraint(new midgard_query_property('metadata.creator'), '=', new midgard_query_value($value));
                 }
                 break;
             case 'id':
             case 'name':
             case 'provider':
                 $constraint = new midgard_query_constraint(new midgard_query_property($filter), '=', new midgard_query_value($value));
                 break;
         }
         // set the constraint
         count($filters) > 1 ? $qc->add_constraint($constraint) : ($qc = $constraint);
     }
     $q->set_constraint($qc);
     $q->add_order(new midgard_query_property('metadata.created'), SORT_DESC);
     $q->execute();
     // does not seem to work
     // @bug: $q->toggle_read_only(false);
     $objects = $q->list_objects();
     if (count($objects)) {
         foreach ($objects as $object) {
             $devices[] = self::extend_device($object);
         }
     }
     return $devices;
 }
Exemplo n.º 4
0
 public function get_comments(array $args)
 {
     $this->data['to'] = midgard_object_class::get_object_by_guid($args['to']);
     if (!$this->data['to']) {
         throw new midgardmvc_exception_notfound("Comment target not found");
     }
     $this->data['comments'] = array();
     $storage = new midgard_query_storage('com_meego_comments_comment_author');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('to', $storage), '=', new midgard_query_value($this->data['to']->guid)));
     $q->add_order(new midgard_query_property('posted', $storage), SORT_ASC);
     $q->execute();
     $comments = $q->list_objects();
     foreach ($comments as $comment) {
         $this->data['comments'][$comment->commentid] = $comment;
     }
     if (midgardmvc_core::get_instance()->authentication->is_user()) {
         $this->data['can_post'] = true;
     } else {
         $this->data['can_post'] = false;
     }
 }
Exemplo n.º 5
0
 /**
  * Gathers ratings and appends them to data
  *
  * @param guid of the package
  * @return array of ratings together with their comments
  */
 public function prepare_ratings($package_guid)
 {
     $retval = array();
     $storage = new midgard_query_storage('com_meego_package_ratings');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('guid'), '=', new midgard_query_value($package_guid)));
     $q->add_order(new midgard_query_property('posted', $storage), SORT_DESC);
     $q->execute();
     $ratings = $q->list_objects();
     foreach ($ratings as $rating) {
         $rating->stars = '';
         if ($rating->rating || $rating->commentid) {
             // add a new property containing the stars to the rating object
             $rating->stars = com_meego_ratings_controllers_rating::draw_stars($rating->rating);
             // pimp the posted date
             $rating->date = gmdate('Y-m-d H:i e', strtotime($rating->posted));
             // avatar part
             $rating->avatar = false;
             if ($rating->authorguid) {
                 $username = null;
                 // get the midgard user name from rating->authorguid
                 $user = com_meego_packages_utils::get_user_by_person_guid($rating->authorguid);
                 if ($user) {
                     $username = $user->login;
                     if ($username && $username != 'admin') {
                         // get avatar and url to user profile page only if the user is not the midgard admin
                         try {
                             $rating->avatar = com_meego_packages_utils::get_avatar($username);
                             $rating->avatarurl = $this->mvc->configuration->user_profile_prefix . $username;
                         } catch (Exception $e) {
                             // no avatar
                         }
                     }
                 }
             }
         }
         array_push($retval, $rating);
     }
     unset($ratings);
     return $retval;
 }
Exemplo n.º 6
0
 /**
  * Retrieves programs using various filters
  *
  * @param array filters, possible members: name, creator, status
  *              if multiple members used then we do a logical AND with them
  * @return object com_meego_devprogram_program object
  */
 public static function get_programs(array $filters)
 {
     $programs = array();
     $storage = new midgard_query_storage('com_meego_devprogram_program');
     $q = new midgard_query_select($storage);
     if (count($filters) > 1) {
         $qc = new midgard_query_constraint_group('AND');
     }
     foreach ($filters as $filter => $value) {
         switch ($filter) {
             case 'deleted':
                 if ($value) {
                     $q->include_deleted(true);
                 }
                 break;
             case 'creator':
                 // check if the value is a real guid
                 if (mgd_is_guid($value)) {
                     $constraint = new midgard_query_constraint(new midgard_query_property('metadata.creator'), '=', new midgard_query_value($value));
                 }
                 break;
             case 'id':
             case 'name':
             case 'device':
                 $constraint = new midgard_query_constraint(new midgard_query_property($filter), '=', new midgard_query_value($value));
                 break;
             case 'status':
                 // current date and time
                 $now = date("Y-m-d H:i:s");
                 switch ($value) {
                     case CMD_PROGRAM_CLOSED:
                         $type = '<';
                         break;
                     case CMD_PROGRAM_OPEN:
                     default:
                         $type = '>';
                 }
                 $constraint = new midgard_query_constraint(new midgard_query_property('duedate'), $type, new midgard_query_value($now));
                 break;
             case 'daysleft':
                 // duedate < now + value
                 $now = new DateTime();
                 $limit = $now->add(new DateInterval('P' . $value . 'D'));
                 $constraint = new midgard_query_constraint(new midgard_query_property('duedate'), '<', new midgard_query_value($limit->format('Y-m-d')));
                 break;
         }
         // set the constraint
         count($filters) > 1 ? $qc->add_constraint($constraint) : ($qc = $constraint);
     }
     $q->set_constraint($qc);
     $q->add_order(new midgard_query_property('metadata.created'), SORT_DESC);
     $q->execute();
     // does not seem to work
     // @bug: $q->toggle_read_only(false);
     $objects = $q->list_objects();
     if (count($objects)) {
         foreach ($objects as $object) {
             $programs[] = self::extend_program($object);
         }
     }
     return $programs;
 }
Exemplo n.º 7
0
 /**
  * Sets the average rating of the package
  * Sets the flag showing if the package was ever rated or not
  * Sets $this->data['stars'] that can be directly put to pages showing
  * the stars
  */
 public function get_average(array $args)
 {
     $this->data['to'] = midgard_object_class::get_object_by_guid($args['to']);
     if (!$this->data['to']) {
         throw new midgardmvc_exception_notfound("rating target not found");
     }
     parent::get_read($args);
     $this->data['ratings'] = array();
     $this->data['average'] = 0;
     $this->data['rated'] = false;
     $storage = new midgard_query_storage('com_meego_ratings_rating_author');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('to'), '=', new midgard_query_value($this->data['to']->guid)));
     $q->add_order(new midgard_query_property('posted'), SORT_DESC);
     $q->execute();
     $ratings = $q->list_objects();
     $sum = 0;
     // only contains ratings where rating is not 0
     $num_of_valid_ratings = 0;
     if (count($ratings)) {
         $this->data['rated'] = true;
         foreach ($ratings as $rating) {
             $rating->stars = '';
             if ($rating->ratingcomment) {
                 $comment = new com_meego_comments_comment($rating->ratingcomment);
                 $rating->ratingcommentcontent = $comment->content;
             }
             if ($rating->rating || $rating->ratingcomment) {
                 // add a new property containing the stars to the rating object
                 $rating->stars = $this->draw_stars($rating->rating);
                 // pimp the posted date
                 $rating->date = gmdate('Y-m-d H:i e', strtotime($rating->posted));
                 $sum += $rating->rating;
                 if ($rating->rating) {
                     // count only non zero ratings
                     ++$num_of_valid_ratings;
                 }
             }
             array_push($this->data['ratings'], $rating);
         }
         if ($num_of_valid_ratings) {
             $this->data['average'] = round($sum / $num_of_valid_ratings, 1);
         }
     }
     $this->get_stars($this->data['average']);
 }
Exemplo n.º 8
0
 /**
  * Calculates the average rating of the package
  * Sets the flag showing if the package was ever rated or not
  */
 public function calculate_average(array $args)
 {
     try {
         $this->data['to'] = midgard_object_class::get_object_by_guid($args['to']);
     } catch (midgard_error_exception $e) {
         midgardmvc_core::get_instance()->log(__CLASS__, 'Package with guid: ' . $args['to'] . ' not found. ' . $e->getMessage(), 'error');
         return false;
     }
     $this->data['repository'] = new com_meego_repository($this->data['to']->repository);
     //com_meego_ratings_controllers_rating::get_read($args);
     $this->data['ratings'] = array();
     $this->data['average'] = 0;
     $this->data['rated'] = false;
     $storage = new midgard_query_storage('com_meego_ratings_rating_author');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('to'), '=', new midgard_query_value($this->data['to']->guid)));
     $q->add_order(new midgard_query_property('posted'), SORT_DESC);
     $q->execute();
     $ratings = $q->list_objects();
     $storage = new midgard_query_storage('com_meego_package_statistics_calculated');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('packageguid'), '=', new midgard_query_value($this->data['to']->guid)));
     $q->execute();
     $cache = $q->list_objects();
     $sum = 0;
     // only contains ratings where rating is not 0
     $num_of_valid_ratings = 0;
     $num_of_comments = 0;
     if (count($ratings)) {
         $this->data['rated'] = true;
         foreach ($ratings as $rating) {
             $rating->stars = '';
             if ($rating->ratingcomment) {
                 $num_of_comments++;
             }
             if ($rating->rating || $rating->ratingcomment) {
                 $sum += $rating->rating;
                 if ($rating->rating) {
                     // count only non zero ratings
                     ++$num_of_valid_ratings;
                 }
             }
         }
         if ($num_of_valid_ratings) {
             $this->data['average'] = round($sum / $num_of_valid_ratings, 1);
         }
     }
     if (count($cache) > 0) {
         $update = midgard_object_class::get_object_by_guid($cache[0]->guid);
         if (!$update->packageguid) {
             $update->packageguid = $this->data['to']->guid;
         }
         $update->ratings = $num_of_valid_ratings;
         $update->ratingvalue = $this->data['average'];
         $update->comments = $num_of_comments;
         $update->update();
     } else {
         $cache_record = new com_meego_package_statistics_calculated();
         $cache_record->packagename = $this->data['to']->name;
         $cache_record->packageguid = $this->data['to']->guid;
         $cache_record->repository = $this->data['repository']->id;
         $cache_record->ratings = $num_of_valid_ratings;
         $cache_record->ratingvalue = $this->data['average'];
         $cache_record->comments = $num_of_comments;
         $cache_record->create();
     }
 }
Exemplo n.º 9
0
 /**
  * Retrieves all comments from the database
  * @param guid object f which the comments should be gathered
  * @return array of comment objects
  */
 private function get_comments($guid = null)
 {
     $storage = new midgard_query_storage('com_meego_comments_comment_author');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('to'), '=', new midgard_query_value($guid)));
     $q->add_order(new midgard_query_property('posted', $storage), SORT_DESC);
     $q->execute();
     $comments = $q->list_objects();
     $retval = array();
     foreach ($comments as $comment) {
         $object = $comment;
         $string = preg_replace_callback('|\\\\(\\d{3})|', function ($matches) {
             return chr(octdec($matches[1]));
         }, $comment->content);
         $object->fixed_content = $string;
         $retval[] = $object;
     }
     return $retval;
 }
Exemplo n.º 10
0
 /**
  * Get a lightweight history of an app
  *
  * @param array of args (os, version, ux, basecategory, packagename)
  */
 public function get_lightweight_history(array $args)
 {
     $ux = null;
     $history = array();
     if ($args['ux'] != '') {
         $ux = $args['ux'];
     }
     // collect all ids of this app having the same os and ux
     $storage = new midgard_query_storage('com_meego_package_details');
     $q = new midgard_query_select($storage);
     $qc = new midgard_query_constraint_group('AND');
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('packagename'), '=', new midgard_query_value($args['packagename'])));
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('repoos'), '=', new midgard_query_value($args['os'])));
     if ($ux) {
         $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('repoosux'), '=', new midgard_query_value($ux)));
     }
     $q->set_constraint($qc);
     $q->add_order(new midgard_query_property('packageid', $storage), SORT_ASC);
     $q->execute();
     $packages = $q->list_objects();
     foreach ($packages as $package) {
         if (end($history) != $package->packageid) {
             $history[] = $package->packageid;
         }
     }
     return $history;
 }
Exemplo n.º 11
0
 /**
  * The main method to return list of packages
  *
  * @param array HTTP GET arguments
  */
 public function get_data(array $args)
 {
     $constraints = array();
     $query = $this->request->get_query();
     $storage = new midgard_query_storage('com_meego_package_details');
     $q = new midgard_query_select($storage);
     $qc = new midgard_query_constraint_group('OR');
     // filter all hidden packages
     $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('packagehidden'), '=', new midgard_query_value(1)));
     // filter packages by their names
     foreach ($this->mvc->configuration->sql_package_filters as $filter) {
         $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('packagename'), 'LIKE', new midgard_query_value($filter)));
         $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('packagetitle'), 'LIKE', new midgard_query_value($filter)));
     }
     $q->set_constraint($qc);
     $q->execute();
     $filtered = array();
     foreach ($q->list_objects() as $package) {
         $filtered[] = $package->packageid;
     }
     if (count($filtered)) {
         $constraints[] = new midgard_query_constraint(new midgard_query_property('packageid'), 'NOT IN', new midgard_query_value($filtered));
     }
     if (count($query)) {
         if (array_key_exists('search', $query) && strlen($query['search'])) {
             $cnstr1 = new midgard_query_constraint(new midgard_query_property('packagename'), 'LIKE', new midgard_query_value('%' . $query['search'] . '%'));
             $cnstr2 = new midgard_query_constraint(new midgard_query_property('packagetitle'), 'LIKE', new midgard_query_value('%' . $query['search'] . '%'));
             $group_constraint = new midgard_query_constraint_group("OR", $cnstr1, $cnstr2);
             $constraints[] = $group_constraint;
         }
         if (array_key_exists('categories', $query) && strlen($query['categories'])) {
             $constraints[] = new midgard_query_constraint(new midgard_query_property('basecategory'), 'IN', new midgard_query_value(explode('x', $query['categories'])));
         }
         if (array_key_exists('license', $query) && strlen($query['license'])) {
             $constraints[] = new midgard_query_constraint(new midgard_query_property('packagelicenseid'), 'IN', new midgard_query_value(explode(',', $query['license'])));
         }
         if (array_key_exists('distribution', $query) && strlen($query['distribution'])) {
             $constraints[] = new midgard_query_constraint(new midgard_query_property('repoosversionid'), 'IN', new midgard_query_value(explode(',', $query['distribution'])));
         }
         if (array_key_exists('dependency', $query) && strlen($query['dependency'])) {
             $constraints[] = new midgard_query_constraint(new midgard_query_property('repoosuxid'), 'IN', new midgard_query_value(explode(',', $query['dependency'])));
         }
         if (array_key_exists('sortmode', $query) && strlen($query['sortmode'])) {
             switch ($query['sortmode']) {
                 case 'new':
                     $q->add_order(new midgard_query_property('packagecreated'), SORT_DESC);
                     break;
                 case 'high':
                     $q->add_order(new midgard_query_property('statscachedratingvalue'), SORT_DESC);
                     //sort by name too
                     $q->add_order(new midgard_query_property('packagetitle'), SORT_ASC);
                     break;
                 case 'down':
                     //sort by name too
                     $q->add_order(new midgard_query_property('statscachedratingvalue'), SORT_ASC);
                 case 'alpha':
                 default:
                     $q->add_order(new midgard_query_property('packagetitle'), SORT_ASC);
                     break;
             }
         }
     }
     if (isset($args['id'])) {
         $constraints[] = new midgard_query_constraint(new midgard_query_property('packageid'), '=', new midgard_query_value($args['id']));
     }
     $qc = null;
     if (count($constraints) > 1) {
         $qc = new midgard_query_constraint_group('AND');
         foreach ($constraints as $constraint) {
             $qc->add_constraint($constraint);
         }
     } else {
         if (isset($constraints[0])) {
             $qc = $constraints[0];
         }
     }
     if (is_object($qc)) {
         $q->set_constraint($qc);
     }
     // 1st execute to get the total number of records
     // required by OCS
     $q->execute();
     $total = $q->get_results_count();
     if (array_key_exists('pagesize', $query) && strlen($query['pagesize'])) {
         $this->pagesize = $query['pagesize'];
     }
     $q->set_limit($this->pagesize);
     $page = 0;
     if (array_key_exists('page', $query) && strlen($query['page'])) {
         $page = $query['page'];
     }
     $offset = $page * $this->pagesize;
     $q->set_offset($offset);
     if ($offset > $total) {
         $offset = $total - $this->pagesize;
     }
     // 2nd execute to limit pagesize
     $q->execute();
     $ocs = new com_meego_ocs_OCSWriter();
     if ($total > 0) {
         $packageids = array();
         $localpackages = array();
         $packages = $q->list_objects();
         $done = array();
         foreach ($packages as $package) {
             if (in_array($package->packageid, $packageids)) {
                 // mimic distinct (Midgard Ratatoskr does not support it on SQL level)
                 --$total;
                 continue;
             }
             // set a special flag if the package is from a testing repository
             $package->testing = false;
             foreach ($this->mvc->configuration->top_projects as $top_project) {
                 if ($top_project['staging'] == $package->repoprojectname) {
                     $package->testing = true;
                 }
             }
             $package->comments_count = 0;
             // get number of comments
             $comments_qs = new midgard_query_storage('com_meego_comments_comment');
             $comments_q = new midgard_query_select($comments_qs);
             $comments_q->set_constraint(new midgard_query_constraint(new midgard_query_property('to'), '=', new midgard_query_value($package->packageguid)));
             $comments_q->execute();
             $package->comments_count = $comments_q->get_results_count();
             // get attachments
             $origpackage = new com_meego_package($package->packageguid);
             $package->attachments = $origpackage->list_attachments();
             unset($origpackage);
             // get the voters (who rated the package)
             $package->ratings = '';
             $ratings = com_meego_packages_controllers_application::prepare_ratings($package->packagename, true);
             if (count($ratings['ratings'])) {
                 foreach ($ratings['ratings'] as $rating) {
                     $ratings_[] = array('user' => $rating->user, 'version' => $rating->version, 'rate' => $rating->rating, 'date' => $rating->date);
                 }
                 $package->ratings = serialize($ratings_);
             }
             // some attributes returned only if an exact package is queried
             if (isset($args['id'])) {
                 // generate the URL of the package instance
                 $path = midgardmvc_core::get_instance()->dispatcher->generate_url('package_instance', array('package' => $package->packagename, 'version' => $package->packageversion, 'project' => $package->repoprojectname, 'repository' => $package->reponame, 'arch' => $package->repoarch), '/');
                 $package->commentsurl = com_meego_ocs_controllers_providers::generate_url($path);
                 // get the roles
                 $package->roles = null;
                 $roles = com_meego_packages_controllers_application::get_roles($package->packageguid);
                 if (count($roles)) {
                     $package->roles = serialize($roles);
                 }
                 // get the forms
                 $package->qa = null;
                 $forms = com_meego_packages_utils::get_stripped_forms_for_package($package);
                 if (count($forms)) {
                     $package->qa = serialize($forms);
                 }
             }
             if ($package->packagename != '') {
                 //get history
                 $args = array('os' => $package->repoos, 'version' => $package->repoosversion, 'ux' => $package->repoosux, 'packagename' => $package->packagename);
                 if (!isset($done[$package->packagename])) {
                     $packagehistory = com_meego_packages_controllers_application::get_lightweight_history($args);
                     if (count($packagehistory)) {
                         $package->history = serialize($packagehistory);
                         $done[$package->packagename] = $package->history;
                         //die;
                     }
                 } else {
                     // just copy the history
                     $package->history = $done[$package->packagename];
                 }
             }
             $localpackages[] = $package;
             $packageids[] = $package->packageid;
         }
         // write the xml content
         $ocs->writeMeta($total, $this->pagesize);
         $ocs->writeContent(array_values($localpackages));
         unset($done, $packageids, $localpackages);
     } else {
         // item not found
         $ocs->writeMeta($total, $this->pagesize, 'content not found', 'failed', 101);
         $ocs->writeEmptyData();
     }
     $ocs->endDocument();
     self::output_xml($ocs);
 }
Exemplo n.º 12
0
 /**
  * Returns all imported repositories using a view
  * @return array
  */
 public function get_all_repositories()
 {
     $storage = new midgard_query_storage('com_meego_package_repository_project');
     $q = new midgard_query_select($storage);
     $q->set_constraint(new midgard_query_constraint(new midgard_query_property('repodisabledownload'), '=', new midgard_query_value(false)));
     $q->add_order(new midgard_query_property('repotitle'), SORT_ASC);
     $q->execute();
     $repositories = $q->list_objects();
     return self::append_repositories($repositories);
 }