Feed aggregator

Savas Labs: Sassy Drupal theming: Setting up Bourbon and Neat

Planet Drupal - Fri, 21/08/2015 - 02:00

When Savas built a custom Drupal 8 theme, we needed to include a grid framework and chose Bourbon's Neat for its ease of use, its light weight, and the library of useful Sass mixins provided by Bourbon. In this post I detail how to set all of this up and use Compass to compile SCSS.

Continue reading…

Categories: Elsewhere

Axel Beckert: German-written Debian Package Management Book

Planet Debian - Fri, 21/08/2015 - 01:28
Thursday was our big day: After more than 2.5 years of working in the hidden, ups and downs, Frank Hofmann and myself were able to announce the availability of our book project Debian Package Management under a free license (Creative Commons Attribution ShareAlike 4.0 International License, short “CC BY-SA 4.0”) during a Lightning Talk at DebConf15 in Heidelberg.

This became possible because we found Onyx Neon, a publishing company which is specialised on books with contents under free licenses. Its founder does not only have a faible for Perl but also for Debian. (Since the question already came up: We also thought about self-publishing, e.g. via Lulu or Epubli — and it would have been our fallback solution —, but we prefer the professionalism and services of a real publisher. I’m though happy to share what I found out about self-publishing in the past few months.)

The source code of the book is written in the AsciiDoc format and available on GitHub.

The book is still work in progress. But if you want, you can already build an e-book out of the publically available source code:

sudo apt-get install asciidoc dblatex git git clone git://github.com/dpmb/dpmb.git cd dpmb make

(Works fine on Debian 7 Wheezy, Debian 8 Jessie and Ubuntu 14.04 LTS Trusty. Does not work on Ubuntu 12.04 LTS Precise.)

If you find an error in the book, please file an issue on GitHub. If you also know how to fix the error, please for the Git repository on GitHub, fix the error in your Git repository and file a pull request. (The first pull request already happenend and has been applied.)

Initially there will be only a German written issue as e-book (at least in HTML, PDF and EPUB formats, maybe also KF8/MOBI and EPUB3) and at some point in the future also as printed book at Onyx Neon. But we’re also planning a translation to English as well as a Debian package.

If your want to get informed when we publish a printed book, a translation or an official e-book release, please subscribe to one of our mailing lists: There’s one in German and one in English.

Categories: Elsewhere

Sune Vuorela: Debconf 2015 – 7

Planet Debian - Fri, 21/08/2015 - 00:08

The other day, the main talk was “Lets encrypt”, today it was “Let’s reproduce”

Categories: Elsewhere

Promet Source: Responsive Design Testing the Promet Way

Planet Drupal - Thu, 20/08/2015 - 23:07

Responsive design is a watchword for many web design gurus, and it has become a kind of unspoken rule for online experiences: If your website can’t respond to users on every device, then it is an affront to those users. This rule, which maybe doesn’t have to include such unforgiving terms as “affront,” has to be acknowledged well before a user even has a chance to set their eyes and cursor on a website.

Responsiveness is arguably the first barrier to creating good user experiences. So if it’s such common knowledge, then why are we all still talking about it?

Categories: Elsewhere

Four Kitchens: drupal_practice_group_install()

Planet Drupal - Thu, 20/08/2015 - 21:26

How do you prepare for the inevitable, yet moving target of Drupal 8 when you’re busy with client work? Join Four Kitchens Web Chefs as we take the plunge with a practice group.

Categories: Elsewhere

Acquia Developer Center Blog: Five Ways to Leverage Third-Party APIs: The Drupal-Zendesk Integration

Planet Drupal - Thu, 20/08/2015 - 20:36

When Acquia’s Global Support Team outgrew their ticketing system in 2013, it was time to make a change. An outdated ticketing system was taxing their team and compromising their ability to support customers. In addition to lacking the core functionality required to meet increasing customer expectations, the third-party vendor lacked visibility and integration with existing systems like JIRA and Toggl, reporting was slow, and SLA was waning.

The Global Support Team decided to look for a new, flexible API that would deliver tight integration with existing systems and generate responsive channels for quick, direct and clear communications. Reporting needed to be real-time and fast, and the customer and agent UX needed to be streamlined. Acquia needed a new system.

In Walks Zendesk

After systematic vendor vetting, Acquia’s Global Support Team quickly determined that Zendesk’s documented API provided the flexibility needed to do things the Acquian way. Zendesk is a customer service platform that provides the ideal framework for an enterprise environment. Zendesk offers an out-of-the-box solution, which provides a front-end customer interface and a back-end agent UX. Instead of just “drinking their own champagne,” Acquia decided to split a bottle with Zendesk’s REST API and develop the front-end of their Acquia Help Center in Drupal.

Drupal-Zendesk Integration

With a Drupal-Zendesk solution, Acquia built a powerful ticket request system that provides unparalleled support to their customers and internal teams. Here are five ways Acquia’s Support team leveraged a third-party API to build a new ticketing system.

1. Using Zendesk’s API to create customer requests in Acquia’s Help Center on Drupal

Acquia needed to migrate nearly 100k pre-existing tickets into Zendesk. This kind of overhaul required some reconciliation. Reorganization consisted of deleting completed tickets, cleaning up the open ticket queue, and configuring data into Zendesk.

The new Acquia Help Center was built using Zendesk’s REST API in Drupal, providing a Customer UX that is easy to navigate. The Agent UX, utilized internally by the support team, is outfitted with all of Zendesk’s built-in functionality. Zendesk also offered Acquia’s Global Support Team the ability to customize their apps to guarantee top performance.

2. Additional Info Block Application

The flexibility of the Zendesk Apps Framework allows companies to extend the capabilities of the framework to leverage tickets, users and knowledgebases. Acquia customized their solution with an Additional Info Block Application, embedded in the Agent UX. The info block provides a global and integrated view of the customer.

The info box displays information such as the product the customer is using, the number of application support tickets their subscription enables them to register, what networks they are connected to, special handling notes and their account management team.

“This heightened customer visibility allows diverse members of Acquia’s Global Support Team to best support the customer’, says Jeannie Finks, Director of Global Support Systems and Programs at Acquia. “This supplementary ticket data is a necessity for our team to provide customers with the personalized assistance they need and now expect”.

3. Time Tracking App

By leveraging the flexibility of the Zendesk Apps Framework, Acquia was able to aggregate all of their systems in one place. Existing systems like JIRA and Toggl are essential to Acquia’s workflow, and needed to remain accessible in the Agent UX. Toggl is a time tracking app that allows you to sync your entries in real time. Toggl’s cloud based framework is Acquia’s default time tracking interface. Acquia’s custom Toggl-Zendesk app pushes ticket time to a central repo of daily agent activity:

Additionally, Zendesk’s partnership has enhanced the view of the customers through expert reporting. The Zendesk toolkit allowed Acquia to track tickets rolled in by account, customer backlog, and a root cause report. The introduction of expert reporting offers support teams a comprehensive overview of the customer. Real-time reporting provides Acquia’s Support Leadership with the resources needed to proactively identify critical issues and solve them quickly. This Info Block increases customer visibility, allowing Acquia to see what their customer needs, right when they need it.

4. Custom SLA Monitoring and Notification within Zendesk

The ticketing system also monitors the status of tickets based on a customer’s Service Level Agreement. Acquia continues to take advantage of Zendesk’s flexibility by configuring SLA data from a central customer data warehouse. This customization generates alerts that flow into all key communication channels, such as mail and chat. This custom monitoring system notifies teams when SLA expiration time is appended to a ticket, providing support teams with the visibility needed to best assist the customer.


 

5. JIRA and Zendesk Linked Tickets

In addition to Toggl, JIRA is a ticketing system that Acquia’s Global Support Team utilized internally. It was a workflow necessity to have continued access to JIRA, and Zendesk’s robust API enabled Acquia to do so. Acquia further customized their API with a mini app that linked tickets filed in JIRA and Zendesk.

The system scans Zendesk ticket comments, subject, and internal URL fields. After scanning, it will match any Acquia JIRA project keys. The system will then display the JIRA key, subject, status, time created, updated time, reporter and assignee. Comment links can also be added to any JIRA ticket.

“The benefit of these customized applications is that all of Acquia’s support systems are connected in one place”, says Finks. “The convenience of having JIRA, Toggl and a customer info block in the Agent UX relieves the major pain points that were taxing our internal teams. Through our integration with Zendesk, Acquia’s Help Center is able to offer unparalleled global support to customers 24/7”.

The next installment of our series will examine best practices when integrating with a third-party API.

Blog series: Integrating Drupal and ZendeskWorkflow: PendingFeatured: NoTags: acquia drupal planetDrupal 8 related: NoAuthor: Georgianna Anderson
Categories: Elsewhere

OSTraining: How to Use the AdvAgg Drupal Module

Planet Drupal - Thu, 20/08/2015 - 19:51

Over the last couple of years, I've seen one module appear on almost every high profile Drupal site.

That module is Advanced CSS/JS Aggregation, or AdvAgg, for short.

AdvAgg really helps to improve the frontend performance of your site. This module really helps to improve the aggregation and optimization of your site's CSS and Javascript files.

Here are two videos that will help you install and configure AdvAgg:

Categories: Elsewhere

Drupal Watchdog: Drush: The Swiss Army Knife for Drupal

Planet Drupal - Thu, 20/08/2015 - 18:21
Article

By now, if you have been using Drush for a while I assume you are comfortable with all the basics. (I consider the basics to be things like downloading modules or updating a site.) I also assume you are aware that Drush has plenty of other features built in, but you probably don't take advantage of them. In this article I want to show you a few things that are just as easy to use as the “basics” and only require a little upfront setup to use them. Once you learn them, they will quickly find their way into your daily workflow.

Shell Aliases

Consider how much time you spend typing out commands. Now think of all the commands you type over and over again. Next, think about all the commands that have a lot of options and how often you refer to help resources to remember which options you need to use. Wouldn’t it be better if we simplified those things? Conveniently, Drush allows you to do exactly that: create shortcuts or aliases in a file called drushrc.php. I'll refer to it as the command file later in this article.

Let's start with an easy example: the clear cache command. This command isn't very long but we can still improve on it. Plus, it's probably one of the most frequently used.

Edit your drushrc.php file; if it doesn't exist create it. It's typically in your home folder at:

~/.drush/drushrc.php

Add this line to the bottom of this file and save it:

$options['shell-aliases']['ca'] = 'cache-clear all';

We just added a shell alias. Now instead of typing this:

$ drush clear-cache all

You only need to type:

$ drush ca

That wasn't too hard, right? That was one line of code, and you just improved on an already very simple command.

Categories: Elsewhere

Raphael Geissert: Call for release goal: package reconsideration

Planet Debian - Thu, 20/08/2015 - 11:33
Based on a discussion around breakfast, and encouraged by the people at the table, I hereby call for a new release goal (or challenge, whatever you prefer to call it):


Every package maintainer should remove one of their packages from the archive.


It's dead simple. It is acceptable to adopt a package to replace the one that has been removed, or to add a new one to the archive.
For tracking purposes please include "for RG" (release goal) in the removal request to ftp.debian.org.


And how about a debconf challenge? how about filing over 100 removal requests before the end of Debconf 15 on Saturday night? blog about it, dent/twit about it, spam IRC about it!


The idea came up after discussing about how us as package maintainers refuse to remove our obsolete or unused packages. So yes, that may also include the very first package that you got into the archive.


Sad news, good news.
Categories: Elsewhere

Simon Kainz: vim in Heidelberg

Planet Debian - Thu, 20/08/2015 - 11:30

Following the tradition of Love Locks, apparently there is someone really in love with vim in Heidelberg!

Found at the Old Bridge in Heidelberg during DebConf15.

Categories: Elsewhere

Sune Vuorela: Debconf 2015 – 6

Planet Debian - Thu, 20/08/2015 - 09:48

There is more people with blue hair at Debconf than at an average Akademy. KDE – we need to do better :)

Categories: Elsewhere

Chapter Three: Decapitated Drupal: The Downsides of Decoupling

Planet Drupal - Thu, 20/08/2015 - 02:57

Anyone who has attended a Drupal event in the last few years has had plenty of opportunities to learn all about the technical details of implementing a headless Drupal site. If you haven't already been exposed to this concept the TLDR version is: Headless aka decoupled Drupal is the process of using your Drupal site as the backend for another framework, most typically a Javascript framework.



"The right time to add an abstraction to a design is at the point when you start feeling the pain of not having it."

- http://sam-koblenski.blogspot.com/2014/07/the-cost-of-abstraction.html

Categories: Elsewhere

Wuinfo: A Good Content Strategy Secures a Profitable Business

Planet Drupal - Wed, 19/08/2015 - 23:45

Small and medium-size businesses can benefit with a good content strategy backed by a content management system (CMS) like Drupal. The internet is evolving fast. A good content strategy helps business keep a close pace with the trend.

More and more people are using mobile phones to get information and connect with others. A CMS website can quickly turn into responsive design. A responsive website provides better user experience for mobile users. Hence, Google ranks a responsive website higher than none responsive ones.

It is beneficial for a business to have a long term and short term digital plan. It saves money in a long run. If a company has a consistent plan for next 5 to 15 years, it helps avoid costly overhaul of previously built software and redo anything just because it did not fit into a big picture.

Here is an example of my customer who is doing great in the travel insurance business. Their consistent content strategy help them take a lion share of a niche market, a Chinese travel insurance market.

They are focusing on Chinese travel insurance market. At the very beginning, the owner of the business Jun Niu has an excellent long-term goal for his business. He built a comprehensive Drupal based system for his insurance business. With Drupal powerful Multi-lingual support, he built a website having three languages. The website is serving as a primary marketing tool. Mr. Niu published unique content that are valuable for Chinese travelers to Canada. There is an online insurance quotation system built from a Drupal contributed module. With the quotation system, people can easily compare insurance policies from different insurance companies. They can place an insurance order online. Other than that, backend system catches other customers' leads.

A system built on Drupal is well SEO-tuned. Niu's website rank high in Google search result. Keywords like "Canada travel insurance" in the Chinese language is on the first page of both Google and Baidu. Their website rank high in the search result of other search engines. As I am writing this article, their keyword "Canada travel insurance" in Chinese rank #1 on Google search result and also on the first page of Baidu. It brings thousands of organic search visit and hundreds of high-quality leads every week. Without spending any other marketing dollars, the company doing great with the solid content strategy.

Mr. Niu's had the great vision at the beginning. He built his insurance business on a top of Drupal-based software system. Supported by an active and diverse community of people around the world, Drupal is an enterprise standard open source software. Mr. Niu's system serves as a marketing tool that bring hundreds of quality leads every week. The content management system lets Mr.Niu's employees easily publish blogs and articles. Recently, they hired us a Toronto Drupal shop for a main Drupal version upgrade.

If the software is a pillar of a successful business, building a system from Drupal is a cornerstone of it. A good content strategy secures a profitable business.

Categories: Elsewhere

DrupalCon News: Eating Vegan in Barcelona

Planet Drupal - Wed, 19/08/2015 - 23:17

DrupalCon attendees can enjoy their visit to Barcelona taking a walk around some of the many 

Categories: Elsewhere

Drupal.org frontpage posts for the Drupal planet: Drupal 7.39 and 6.37 released

Planet Drupal - Wed, 19/08/2015 - 22:45

Drupal 7.39 and Drupal 6.37, maintenance releases which contain fixes for security vulnerabilities, are now available for download. See the Drupal 7.39 and Drupal 6.37 release notes for further information.

Download Drupal 7.39
Download Drupal 6.37

Upgrading your existing Drupal 7 and 6 sites is strongly recommended. There are no new features or non-security-related bug fixes in these releases. For more information about the Drupal 7.x release series, consult the Drupal 7.0 release announcement. More information on the Drupal 6.x release series can be found in the Drupal 6.0 release announcement.

Security information

We have a security announcement mailing list and a history of all security advisories, as well as an RSS feed with the most recent security advisories. We strongly advise Drupal administrators to sign up for the list.

Drupal 7 and 6 include the built-in Update Status module (renamed to Update Manager in Drupal 7), which informs you about important updates to your modules and themes.

Bug reports

Both Drupal 7.x and 6.x are being maintained, so given enough bug fixes (not just bug reports) more maintenance releases will be made available, according to our monthly release cycle.

Changelog

Drupal 7.39 is a security release only. For more details, see the 7.39 release notes. A complete list of all changes in the stable 7.x branch can be found in the git commit log.

Drupal 6.37 is a security release only. For more details, see the 6.37 release notes. A complete list of all changes in the stable 6.x branch can be found in the git commit log.

Security vulnerabilities

Drupal 7.39 and 6.37 were released in response to the discovery of security vulnerabilities. Details can be found in the official security advisory:

To fix the security problem, please upgrade to either Drupal 7.39 or Drupal 6.37.

Update notes

See the 7.39 and 6.37 release notes for details on important changes in this release.

Known issues

None.

Front page news: Planet DrupalDrupal version: Drupal 6.xDrupal 7.x
Categories: Elsewhere

Petter Reinholdtsen: In my hand, a pocket book edition of the Norwegian Free Culture book!

Planet Debian - Wed, 19/08/2015 - 22:10

Today, finally, my first printed draft edition of the Norwegian translation of Free Culture I have been working on for the last few years arrived in the mail. I had to fake a cover to get the interior printed, and the exterior of the book look awful, but that is irrelevant at this point. I asked for a printed pocket book version to get an idea about the font sizes and paper format as well as how good the figures and images look in print, but also to test what the pocket book version would look like. After receiving the 500 page pocket book, it became obvious to me that that pocket book size is too small for this book. I believe the book is too thick, and several tables and figures do not look good in the size they get with that small page sizes. I believe I will go with the 5.5x8.5 inch size instead. A surprise discovery from the paper version was how bad the URLs look in print. They are very hard to read in the colophon page. The URLs are red in the PDF, but light gray on paper. I need to change the color of links somehow to look better. But there is a printed book in my hand, and it feels great. :)

Now I only need to fix the cover, wrap up the postscript with the store behind the book, and collect the last corrections from the proof readers before the book is ready for proper printing. Cover artists willing to work for free and create a Creative Commons licensed vector file looking similar to the original is most welcome, as my skills as a graphics designer are mostly missing.

Categories: Elsewhere

Andrew Cater

Planet Debian - Wed, 19/08/2015 - 21:33
Poetry for Debconf15 poetry night

Debian's reached the age of 22
I wish I could be there with you
In Heidelberg, fair German city
To share, in person, this my ditty

Rhonda's worked hard - the work is done
With poems now begins the fun
While others play cards or hack new code
Or dream of running down the road

Free software, arguments, warmth, good cheer
Too soon all over 'til next year
 All of the best are there / on 'Net
Here's hope that it's the best Debconf yet



Categories: Elsewhere

Aigars Mahinovs: Poetry night - Space

Planet Debian - Wed, 19/08/2015 - 21:07

A bi-lingual poem created on inspiration from Debconf15 and in honor of Debconf Poetry Night by Rhonda

Du ...

Du hast ...

Du hast apt ...

Du hast apt gebrochen!

Reconsider your disk usage,

And APT might work again.

(as usual - licenced as CC-BY V3+ or GPLv2+)

Categories: Elsewhere

Drupal Easy: Long Form Drupal Training For Long Term Success

Planet Drupal - Wed, 19/08/2015 - 20:33

It's that time of year again - the next session of the Drupal Career Online program is about to get underway. Interested in learning Drupal best practices, common development shop workflows, as well as a bunch of the tools that modern Drupal professionals use every day? Looking to expand your current development team but don't have the time or the resources to train existing or new staff? If so, the Drupal Career Online program was designed with your needs in mind!

This will be the seventh time we've taught our curriculum, and the ninth time overall that is has been used for long-form Drupal training (Acquia has used it for their Acquia U program). We're confident that it provides students with the knowledge and experience to compress the amount of time it takes to become a Drupal professional.

-->

read more

Categories: Elsewhere

Lullabot: A PHP Developer’s Guide to Caching Data in Drupal 7

Planet Drupal - Wed, 19/08/2015 - 20:30

If there’s one thing in programming that drives me up the wall, it’s patterns that I use once every few months, such that I almost remember what to do but inevitably forget some key detail. Lately, that has been when I’ve needed to cache data from remote web services. I end up searching for A Beginner's Guide to Caching Data in Drupal 7 and checking it’s examples against my code. That’s no fun at all.

After some searching for a different project, I found the Drupal Doctrine Cache project and thought "what if I could chain the static and Drupal cache calls automatically?" - and of course, it’s already done with Doctrine’s ChainCache class. ChainCache gives us a consistent API for all of the usual cache operations. The class takes an array of CacheProvider classes that can be used to cache data. When fetching data, it goes through them in order until it finds the object you’re looking for. As a developer, caching data in memory in a static cache is no different than caching it in MySQL, Redis, or anything else. On top of that, ChainCache handles saving and deleting entries through the entire chain automatically. If you update the database (and invalidate your cached data), you can clear the static and persistent caches with a simple $cache->delete(). In fact, as someone using the cache object directly, you might not even know that a static cache exists! For example, the ChainCache could be updated to also persist data in a local APC cache. Or, the persistent Drupal cache could be removed if it turned out not to improve performance. Calling code doesn't need to have any knowledge of these changes. All that matters is you can reliably save, fetch, and delete cached data with a consistent interface.

What does all this mean? If you’re already using Composer in your Drupal projects, you can easily use these classes to simplify any of your caching code. If you’re not using Composer, this makes a great (and simple) example of how you can start to use modern PHP libraries in your existing Drupal 7 project. Let’s see how this works.

Adding Drupal Doctrine Cache with Composer

The first step is to set up your module so that it requires the Drupal Doctrine Cache library. For modules that get posted on drupal.org, I like to use Composer Manager since it will handle managing Composer libraries when different contributed modules are all using Composer on the same site. Here are the steps to set it up:

  1. Install Composer if you haven’t installed it yet.
  2. Create a Drupal module with an info file and a module file (I’ve put an example module in a sandbox).
  3. In the info file, depend on Composer Manager: dependencies[] = composer_manager
  4. Open up a terminal, and change to the module directory.
  5. Run composer init to create your initial composer.json file. For the package name, use drupal/my_module_name.
  6. When you get to the step to define dependencies (you can modify them later), add capgemini/drupal_doctrine_cache to require the library. You can add it later by editing composer.json or using composer require.

When you enable your module with Drush, Composer Manager will download the library automatically and put it in the vendor folder. For site implementations, it’s worth reading the Composer Manager documentation to learn how to configure folder paths and so on.

Using the CacheProvider for a Static and Persistent Cache

We’re now at the point where we can use all of the classes provided by the Drupal Doctrine Cache library and Doctrine Cache in our module. In a previous implementation, we might have had caching code like this:

function my_module_function() { $my_data = &drupal_static(__FUNCTION__); if (!isset($my_data)) { if ($cache = cache_get('my_module_data')) { $my_data = $cache->data; } else { // Do your expensive calculations here, and populate $my_data // with the correct stuff. cache_set('my_module_data', $my_data); } } return $my_data; }

We can now replace this code with the ChainCache class. While this is nearly the same amount of code as the previous version, I find it much easier to read and understand. One less level of nested if statements makes the code easier to debug. Best of all, to a junior or non-Drupal PHP developer, this code doesn’t contain any "Drupal magic" like drupal_static().

function my_module_function() { // We want this to be static so the ArrayCache() isn’t recreated on each function // call. In OOP code, make this a static class variable. static $cache; if (!$cache) { $cache = new ChainCache([new ArrayCache(), new DrupalDoctrineCache()]); } if ($cache->contains('my_module_data')) { $my_data = $cache->fetch('my_module_data'); } else { // Do your expensive calculations here. $my_data = 'a very hard string to generate.'; $cache->save('my_module_data', $my_data); } return $my_data; }

If the calling code needs to interact with the cache directly, it’s entirely reasonable to return the cache object itself, and document in the @returns tag that a CacheProvider is returned. Your specific caching configuration is safe and abstracted, avoiding sporadic drupal_static_reset() calls in your code.

Interfaces are the Future, and they’re Already Here

Even if you prefer the Drupal-specific version of this code, there’s something really interesting about how Doctrine, a small bit of glue code, and Drupal can now work together. The above is all possible because Doctrine ships a set of interfaces for caching, instead of just creating raw functions or concrete classes. Doctrine is helpful in providing many prebuilt cache implementations, but those can be swapped out for anything - including a thin wrapper around Drupal’s cache functions. You can even go the other way around, and tie Drupal’s cache system into something like Guzzle’s Cache Subscriber to cache HTTP requests in Drupal. By writing our code around interfaces instead of implementations, we let others extend our code in ways that are simply impossible with Drupal-7 style procedural programming. The rest of the PHP community is already operating this way, and Drupal 8 works this way as well.

Do you know about other PHP libraries that are great at working with Drupal 7’s core systems? Share them here by posting a comment below.

Categories: Elsewhere

Pages

Subscribe to jfhovinne aggregator